Compare commits
	
		
			224 Commits
		
	
	
		
			2.8
			...
			feature/cu
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 7dbcffe95d | |||
| 20934a9f47 | |||
| 24890f9bbb | |||
| bd0629301b | |||
| 71da420d86 | |||
| f9be6758e2 | |||
| 93a8c067fc | |||
| 5a372d0f90 | |||
| 806000c4cc | |||
| c32d46cdc0 | |||
| 5736279e8d | |||
| e3f4dc6616 | |||
| a64e06ff7a | |||
| a42b786835 | |||
| e76000d87b | |||
| 60ead71029 | |||
| 4c48fda5ad | |||
| 6a591f2dbc | |||
| 86c30ad948 | |||
| 0ae055b486 | |||
| efcd4f5ab8 | |||
| 232d2d4275 | |||
| 44f96e5383 | |||
| 44812310b0 | |||
| 6ef91bb5e7 | |||
| aa459b0ea6 | |||
| a2adf66618 | |||
| 3405e90df9 | |||
| 9a59947e67 | |||
| 9384d3278c | |||
| 1af3171b2e | |||
| 03fd9e154b | |||
| 3572f683e3 | |||
| 524ffb189c | |||
| 7fac6c8f74 | |||
| 037c645075 | |||
| 2f9bd29dc8 | |||
| 92662c546a | |||
| efa6544623 | |||
| 52cf9daeec | |||
| 4a315722b1 | |||
| a52efd1a12 | |||
| 535df30ada | |||
| bad34dd1d1 | |||
| 5ac7f05f57 | |||
| 8353b59a27 | |||
| 2c6ca6c376 | |||
| f4b03cb0e6 | |||
| c7858997c0 | |||
| bd99ab3992 | |||
| 66f365d38d | |||
| 59987f262d | |||
| 452a28362e | |||
| d6805f383b | |||
| 076611eec7 | |||
| e0fa55e2c0 | |||
| 9ea1994228 | |||
| 36f628c365 | |||
| ff87e72510 | |||
| aef1e29a53 | |||
| 1ebf9ba382 | |||
| 929408d08c | |||
| f57fb93525 | |||
| 788065e456 | |||
| 22b46e0525 | |||
| b75018239a | |||
| 598bb8eec7 | |||
| 869265fc13 | |||
| 5ad813527a | |||
| 73f8d3d50a | |||
| da1701195d | |||
| 9b6334509e | |||
| ac4acc34a4 | |||
| b6963f38d6 | |||
| 182a036ade | |||
| 97f2182290 | |||
| 1986a8c9c3 | |||
| 6905d96329 | |||
| 818f786b1d | |||
| 2948c1bd33 | |||
| 78faab404c | |||
| 64b10970a8 | |||
| 6ab8fd232e | |||
| f337a94112 | |||
| 0135631a3e | |||
| d0e1e8801f | |||
| d1b3a91979 | |||
| 45c1396e0e | |||
| b7301733f0 | |||
| 5df91dbaa8 | |||
| 68918689e7 | |||
| c41dd646da | |||
| a077389b83 | |||
| caa37375c0 | |||
| 3daea8ab43 | |||
| c5d77af0d0 | |||
| 7f7fdf09f4 | |||
| 7aba6a2ecb | |||
| 012395b933 | |||
| 787e3accc0 | |||
| b778940c83 | |||
| 71297c4e5a | |||
| 1d2395e00d | |||
| b69e1886b9 | |||
| d65803a4b7 | |||
| 0e49a68e09 | |||
| 7af5593fd4 | |||
| 25545dac51 | |||
| df77af64ca | |||
| e264ab2cbe | |||
| 8c17ed4146 | |||
| 4ee2e8bc68 | |||
| bdcba613d5 | |||
| 049de0ddaf | |||
| 6be3f378d4 | |||
| 6d8aa33fc9 | |||
| b37ba9f2f1 | |||
| 799f083a74 | |||
| 156abe63cd | |||
| d38016a03f | |||
| 5604c3ee5e | |||
| 5adeae15a9 | |||
| bca94ceb9d | |||
| a42f086339 | |||
| 888edf32be | |||
| ee5536f1b5 | |||
| 59859e5d90 | |||
| 5bae086712 | |||
| 16de83616a | |||
| 6530362b89 | |||
| 0372e03abb | |||
| 26e8ea8a51 | |||
| efd042dd22 | |||
| d06642d51f | |||
| f27bcd7109 | |||
| eaea5a4653 | |||
| fa4bd0ddd5 | |||
| 3cbbdbee92 | |||
| d674e155e1 | |||
| cb3366a559 | |||
| 8de0e11226 | |||
| b12232329b | |||
| 5e63972500 | |||
| d53db967b3 | |||
| 25170d0d83 | |||
| ba6446378a | |||
| 12b08ca8c6 | |||
| bb60f3a9c8 | |||
| ba347a258d | |||
| ac41feff6e | |||
| ec9eb17ee3 | |||
| d2cf13d64b | |||
| 7775f5978b | |||
| 8c031e7649 | |||
| 6b2eae7f26 | |||
| 69805a423f | |||
| f1178157c8 | |||
| 1ebc6eb03a | |||
| 916215c0c2 | |||
| 6c8e149be2 | |||
| bd08b69747 | |||
| 33e0061147 | |||
| 45e1031e5e | |||
| 73b21cb80b | |||
| 15fb825548 | |||
| 0d448368cc | |||
| abacae42d7 | |||
| 9d2e2e7f64 | |||
| eb64cc60c5 | |||
| 5ea0d6446a | |||
| d970d07048 | |||
| 90f45c698f | |||
| af388b2462 | |||
| 8700e2fdde | |||
| 23ad84ef30 | |||
| 0d074ea6ae | |||
| 351a246238 | |||
| 841b5fe2b2 | |||
| 85ce07f11f | |||
| b44f3418f4 | |||
| bfbc40c282 | |||
| 2c66bf3edd | |||
| a51f922ea4 | |||
| 4d8e7a3cd1 | |||
| 70ccf35fe4 | |||
| 6c5032da10 | |||
| b2e269b67c | |||
| cd01c6a808 | |||
| 179d40ac8d | |||
| 754a61e989 | |||
| bedf4c5c4d | |||
| 7c27bcec47 | |||
| 90f09cc222 | |||
| 21d83f93dc | |||
| db838efc65 | |||
| 929af41dd3 | |||
| 979a7672e6 | |||
| 67818ff4dd | |||
| 0c7631e912 | |||
| a06b888365 | |||
| ded10e1c22 | |||
| 2f3bc0d892 | |||
| 184f1b2d2c | |||
| 90249dadb9 | |||
| c88eb32db8 | |||
| d47db29b93 | |||
| e8148af10f | |||
| b298a4ca6c | |||
| f474e38687 | |||
| 2e806f7b86 | |||
| b7a8d99e2d | |||
| 2a09fc7e6f | |||
| e36abb8d55 | |||
| 5746b9f758 | |||
| 6be1f018b1 | |||
| 38a046aaef | |||
| fdbd6f8402 | |||
| 1dad204494 | |||
| 54661c51ce | |||
| b34fe0d0ba | |||
| 868eceddc5 | |||
| b642c396c7 | |||
| f3d8e34ed0 | |||
| 401c760e01 | 
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -6,6 +6,7 @@ | ||||
| SCViewer initiator_target.launch | ||||
| SCViewer.xcf | ||||
| SCViewer_1.png | ||||
| *.launch | ||||
| copyrightLog.txt | ||||
| /workspace | ||||
| ?*.launch | ||||
| /.settings/ | ||||
|   | ||||
							
								
								
									
										17
									
								
								.launch/Build SCViewer.launch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								.launch/Build SCViewer.launch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <launchConfiguration type="org.eclipse.m2e.Maven2LaunchConfigurationType"> | ||||
|     <booleanAttribute key="M2_DEBUG_OUTPUT" value="false"/> | ||||
|     <stringAttribute key="M2_GOALS" value="package"/> | ||||
|     <booleanAttribute key="M2_NON_RECURSIVE" value="false"/> | ||||
|     <booleanAttribute key="M2_OFFLINE" value="false"/> | ||||
|     <stringAttribute key="M2_PROFILES" value=""/> | ||||
|     <listAttribute key="M2_PROPERTIES"/> | ||||
|     <stringAttribute key="M2_RUNTIME" value="EMBEDDED"/> | ||||
|     <booleanAttribute key="M2_SKIP_TESTS" value="false"/> | ||||
|     <intAttribute key="M2_THREADS" value="1"/> | ||||
|     <booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/> | ||||
|     <stringAttribute key="M2_USER_SETTINGS" value=""/> | ||||
|     <booleanAttribute key="M2_WORKSPACE_RESOLUTION" value="false"/> | ||||
|     <booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/> | ||||
|     <stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc:com.minres.scviewer.parent}"/> | ||||
| </launchConfiguration> | ||||
							
								
								
									
										19
									
								
								.launch/Build and deploy SCViewer.launch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								.launch/Build and deploy SCViewer.launch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <launchConfiguration type="org.eclipse.m2e.Maven2LaunchConfigurationType"> | ||||
|     <booleanAttribute key="M2_DEBUG_OUTPUT" value="false"/> | ||||
|     <stringAttribute key="M2_GOALS" value="package"/> | ||||
|     <booleanAttribute key="M2_NON_RECURSIVE" value="false"/> | ||||
|     <booleanAttribute key="M2_OFFLINE" value="false"/> | ||||
|     <stringAttribute key="M2_PROFILES" value="release-composite"/> | ||||
|     <listAttribute key="M2_PROPERTIES"/> | ||||
|     <stringAttribute key="M2_RUNTIME" value="EMBEDDED"/> | ||||
|     <booleanAttribute key="M2_SKIP_TESTS" value="false"/> | ||||
|     <intAttribute key="M2_THREADS" value="1"/> | ||||
|     <booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/> | ||||
|     <stringAttribute key="M2_USER_SETTINGS" value=""/> | ||||
|     <booleanAttribute key="M2_WORKSPACE_RESOLUTION" value="true"/> | ||||
|     <booleanAttribute key="org.eclipse.jdt.launching.ATTR_ATTR_USE_ARGFILE" value="false"/> | ||||
|     <booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_CLASSPATH_ONLY_JAR" value="false"/> | ||||
|     <booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/> | ||||
|     <stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc:com.minres.scviewer.parent}"/> | ||||
| </launchConfiguration> | ||||
							
								
								
									
										20
									
								
								.launch/Set SCViewer version.launch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								.launch/Set SCViewer version.launch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <launchConfiguration type="org.eclipse.m2e.Maven2LaunchConfigurationType"> | ||||
|     <booleanAttribute key="M2_DEBUG_OUTPUT" value="false"/> | ||||
|     <stringAttribute key="M2_GOALS" value="tycho-versions:set-version tycho-versions:update-pom"/> | ||||
|     <booleanAttribute key="M2_NON_RECURSIVE" value="false"/> | ||||
|     <booleanAttribute key="M2_OFFLINE" value="false"/> | ||||
|     <stringAttribute key="M2_PROFILES" value=""/> | ||||
|     <listAttribute key="M2_PROPERTIES"> | ||||
|         <listEntry value="newVersion=${string_prompt:new version number}"/> | ||||
|     </listAttribute> | ||||
|     <stringAttribute key="M2_RUNTIME" value="EMBEDDED"/> | ||||
|     <booleanAttribute key="M2_SKIP_TESTS" value="false"/> | ||||
|     <intAttribute key="M2_THREADS" value="1"/> | ||||
|     <booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/> | ||||
|     <stringAttribute key="M2_USER_SETTINGS" value=""/> | ||||
|     <booleanAttribute key="M2_WORKSPACE_RESOLUTION" value="false"/> | ||||
|     <stringAttribute key="bad_container_name" value="/com.minres.scviewer.parent/.launch"/> | ||||
|     <booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/> | ||||
|     <stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc:com.minres.scviewer.parent}"/> | ||||
| </launchConfiguration> | ||||
							
								
								
									
										56
									
								
								.project
									
									
									
									
									
								
							
							
						
						
									
										56
									
								
								.project
									
									
									
									
									
								
							| @@ -14,60 +14,4 @@ | ||||
| 	<natures> | ||||
| 		<nature>org.eclipse.m2e.core.maven2Nature</nature> | ||||
| 	</natures> | ||||
| 	<filteredResources> | ||||
| 		<filter> | ||||
| 			<id>0</id> | ||||
| 			<name></name> | ||||
| 			<type>10</type> | ||||
| 			<matcher> | ||||
| 				<id>org.eclipse.ui.ide.multiFilter</id> | ||||
| 				<arguments>1.0-name-matches-false-false-features</arguments> | ||||
| 			</matcher> | ||||
| 		</filter> | ||||
| 		<filter> | ||||
| 			<id>0</id> | ||||
| 			<name></name> | ||||
| 			<type>10</type> | ||||
| 			<matcher> | ||||
| 				<id>org.eclipse.ui.ide.multiFilter</id> | ||||
| 				<arguments>1.0-name-matches-false-false-plugins</arguments> | ||||
| 			</matcher> | ||||
| 		</filter> | ||||
| 		<filter> | ||||
| 			<id>0</id> | ||||
| 			<name></name> | ||||
| 			<type>10</type> | ||||
| 			<matcher> | ||||
| 				<id>org.eclipse.ui.ide.multiFilter</id> | ||||
| 				<arguments>1.0-name-matches-false-false-com.minres.*</arguments> | ||||
| 			</matcher> | ||||
| 		</filter> | ||||
| 		<filter> | ||||
| 			<id>0</id> | ||||
| 			<name></name> | ||||
| 			<type>10</type> | ||||
| 			<matcher> | ||||
| 				<id>org.eclipse.ui.ide.multiFilter</id> | ||||
| 				<arguments>1.0-name-matches-false-false-product</arguments> | ||||
| 			</matcher> | ||||
| 		</filter> | ||||
| 		<filter> | ||||
| 			<id>0</id> | ||||
| 			<name></name> | ||||
| 			<type>10</type> | ||||
| 			<matcher> | ||||
| 				<id>org.eclipse.ui.ide.multiFilter</id> | ||||
| 				<arguments>1.0-name-matches-false-false-tests</arguments> | ||||
| 			</matcher> | ||||
| 		</filter> | ||||
| 		<filter> | ||||
| 			<id>0</id> | ||||
| 			<name></name> | ||||
| 			<type>10</type> | ||||
| 			<matcher> | ||||
| 				<id>org.eclipse.ui.ide.multiFilter</id> | ||||
| 				<arguments>1.0-name-matches-false-false-p2repositories</arguments> | ||||
| 			</matcher> | ||||
| 		</filter> | ||||
| 	</filteredResources> | ||||
| </projectDescription> | ||||
|   | ||||
							
								
								
									
										61
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								README.md
									
									
									
									
									
								
							| @@ -18,14 +18,55 @@ The viewer has the following features | ||||
|  - sqlite based  | ||||
|  - visualization of transaction relations | ||||
|  | ||||
| To build the plugins the Eclipse SDK or PDE can be used. In both cases the Groovy | ||||
| eclipse plugin (http://groovy.codehaus.org/Eclipse+Plugin or Market) has to be | ||||
| installed. | ||||
| To build the plugins the Eclipse SDK or PDE can be used. | ||||
|  | ||||
| Key Shortcuts | ||||
| ============= | ||||
|  | ||||
| Legend: | ||||
|  | ||||
| * Left Mouse Button: LMB | ||||
| * Middle Mouse Button: MMB | ||||
| * Mouse Scroll wheel: MScrl | ||||
| * Context any means Name List, Value List or Waveform | ||||
|  | ||||
| | Input      | Modifier | Context  | Action                            | | ||||
| |------------|----------|----------|-----------------------------------| | ||||
| | LMB click  |          | any      | select                            | | ||||
| | LMB click  | Shift    | Waveform | move selected marker to position  | | ||||
| | LMB click  | Control  | Waveform | move cursor to position           | | ||||
| | LMB drag   |          | Waveform | zoom to range                     | | ||||
| | MMB click  |          | Waveform | move selected marker to position  | | ||||
| | MScrl      |          | any      | scroll window up/down             | | ||||
| | MScrl      | Shift    | any      | scroll window left/right          | | ||||
| | MScrl      | Control  | Waveform | zoom in/out                       | | ||||
| | Key left   |          | Waveform | scroll window to the left (slow)  | | ||||
| | Key right  |          | Waveform | scroll window to the right (slow) | | ||||
| | Key left   | Shift    | Waveform | scroll window to the left (fast)  | | ||||
| | Key right  | Shift    | Waveform | scroll window to the right (fast) | | ||||
| | Key up     |          | Waveform | move selection up                 | | ||||
| | Key down   |          | Waveform | move selection down               | | ||||
| | Key up     | Control  | Waveform | move selected track up            | | ||||
| | Key down   | Control  | Waveform | move selected track down          | | ||||
| | Key +      | Control  | Waveform | zoom in                           | | ||||
| | Key -      | Control  | Waveform | zoom out                          | | ||||
| | Key Pos1   |          | Waveform | jump to selected marker           | | ||||
| | Key End    |          | Waveform | jump to cursor                    | | ||||
| | Key Del    |          | any      | delete selected entries           | | ||||
| | LMB click  |          | ZoomBar  | increment/decrement 1 page        | | ||||
| | LMB drag   |          | ZoomBar  | drag both markers (pan)           | | ||||
| | LMB drag   | Control  | ZoomBar  | drag one marker (zoom)            | | ||||
| | MMB drag   |          | ZoomBar  | drag one marker (zoom)            | | ||||
| | xMB dclick |          | ZoomBar  | pan to position                   | | ||||
| | MScrl      |          | ZoomBar  | scroll window left/right          | | ||||
| | MScrl      | Shift    | ZoomBar  | scroll window left/right double speed | | ||||
| | MScrl      | Control  | ZoomBar  | zoom in/out                       | | ||||
| | Key left   |          | ZoomBar  | scroll window to the left (slow)  | | ||||
| | Key right  |          | ZoomBar  | scroll window to the right (slow) | | ||||
| | Key up     |          | ZoomBar  | scroll window to the left (slow)  | | ||||
| | Key down   |          | ZoomBar  | scroll window to the right (slow) | | ||||
| | Key PgUp   |          | ZoomBar  | scroll window to the left (fast)  | | ||||
| | Key PgDown |          | ZoomBar  | scroll window to the right (fast) | | ||||
| | Key Pos1   |          | ZoomBar  | scroll to begin                   | | ||||
| | Key End    |          | ZoomBar  | scroll to end                     | | ||||
|  | ||||
| TODO | ||||
| ==== | ||||
| - add more tests | ||||
| - move to feature based product to allow automatic updates | ||||
| - improve graphics | ||||
| - catch-up e3 plugin to functionality of e4 product | ||||
| - add calculated traces | ||||
|   | ||||
| @@ -1,2 +1,4 @@ | ||||
| bin.includes = feature.xml,\ | ||||
|                feature.properties | ||||
| src.includes = feature.properties,\ | ||||
|                feature.xml | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| featureName=SystemC simulation results viewer | ||||
| featureName=SystemC simulation results viewer database loaders | ||||
| providerName=MINRES Technologies GmbH | ||||
| updateSiteName=SC Viewer Database Updates | ||||
| updateSiteName=SC Viewer Database Loader Updates | ||||
| description=A viewer for SystemC Verification Library transactions and VCD signals. | ||||
| licenseURL=license.html | ||||
| license=\ | ||||
|   | ||||
| @@ -2,17 +2,15 @@ | ||||
| <feature | ||||
|       id="com.minres.scviewer.database.feature" | ||||
|       label="%featureName" | ||||
|       version="1.0.0.qualifier" | ||||
|       version="3.0.0.qualifier" | ||||
|       provider-name="%providerName"> | ||||
|  | ||||
|    <description> | ||||
|       A viewer for SystemC Verification Library transactions and VCD  | ||||
| signals. It supports a SQLite based recording as well as the built-in | ||||
| text base recording. | ||||
|       The database loaders for SystemC Verification Library transactions and VCD signals. They support SQLite based recording as well as the built-in text base recording. | ||||
|    </description> | ||||
|  | ||||
|    <copyright> | ||||
|       Copyright (c) 2015 MINRES Technologies GmbH. | ||||
|       Copyright (c) 2015-2021 MINRES Technologies GmbH. | ||||
| All rights reserved. This program and the accompanying materials | ||||
| are made available under the terms of the Eclipse Public License | ||||
| v1.0 which accompanies this distribution, and is available at  | ||||
| @@ -29,12 +27,12 @@ http://www.eclipse.org/legal/epl-v10.html | ||||
|    </url> | ||||
|  | ||||
|    <requires> | ||||
|       <import plugin="org.codehaus.groovy" version="2.5.8" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.osgi.services" version="3.4.0" match="greaterOrEqual"/> | ||||
|       <import plugin="com.google.guava" version="15.0.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.osgi"/> | ||||
|       <import plugin="com.minres.scviewer.database" version="1.0.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.core.runtime"/> | ||||
|       <import feature="org.eclipse.collections.feature" version="10.4.0.v20200820-2049"/> | ||||
|    </requires> | ||||
|  | ||||
|    <plugin | ||||
| @@ -58,12 +56,6 @@ http://www.eclipse.org/legal/epl-v10.html | ||||
|          version="0.0.0" | ||||
|          unpack="false"/> | ||||
|  | ||||
|    <plugin | ||||
|          id="org.codehaus.groovy" | ||||
|          download-size="0" | ||||
|          install-size="0" | ||||
|          version="0.0.0"/> | ||||
|  | ||||
|    <plugin | ||||
|          id="com.minres.scviewer.database.vcd" | ||||
|          download-size="0" | ||||
|   | ||||
| @@ -5,8 +5,8 @@ | ||||
|   <parent> | ||||
|   	<groupId>com.minres.scviewer</groupId> | ||||
|   	<artifactId>com.minres.scviewer.parent</artifactId> | ||||
|   	<version>2.0.0-SNAPSHOT</version> | ||||
|   	<version>2.15.1</version> | ||||
| 	<relativePath>../..</relativePath> | ||||
|   </parent> | ||||
|   <version>1.0.0-SNAPSHOT</version> | ||||
|   <version>3.0.0-SNAPSHOT</version> | ||||
| </project> | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| <feature | ||||
|       id="com.minres.scviewer.e4.feature" | ||||
|       label="SCViewer Feature" | ||||
|       version="1.0.0.qualifier" | ||||
|       version="1.1.0.qualifier" | ||||
|       provider-name="MINRES Technologies GmbH"> | ||||
|  | ||||
|    <description url="http://www.example.com/description"> | ||||
| @@ -21,14 +21,6 @@ | ||||
|       <update label="SC Viewer Updates" url="http://www.minres.com/scviewer/update"/> | ||||
|    </url> | ||||
|  | ||||
|    <includes | ||||
|          id="com.minres.scviewer.database.feature" | ||||
|          version="0.0.0"/> | ||||
|  | ||||
|    <includes | ||||
|          id="com.minres.scviewer.ui.feature" | ||||
|          version="0.0.0"/> | ||||
|  | ||||
|    <requires> | ||||
|       <import plugin="javax.inject" version="1.0.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.core.runtime" version="3.11.1" match="greaterOrEqual"/> | ||||
| @@ -40,13 +32,10 @@ | ||||
|       <import plugin="org.eclipse.e4.core.di" version="1.5.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.e4.ui.di" version="1.1.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.e4.core.contexts" version="1.4.0" match="greaterOrEqual"/> | ||||
|       <import plugin="com.minres.scviewer.database.ui.swt" version="1.0.0" match="greaterOrEqual"/> | ||||
|       <import plugin="com.minres.scviewer.database" version="1.0.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.osgi.services" version="3.5.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.e4.core.services" version="2.0.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.core.jobs"/> | ||||
|       <import plugin="org.eclipse.osgi"/> | ||||
|       <import plugin="com.google.guava"/> | ||||
|       <import plugin="org.eclipse.equinox.preferences"/> | ||||
|       <import plugin="org.eclipse.core.expressions"/> | ||||
|       <import plugin="org.eclipse.e4.core.commands" version="0.11.0" match="greaterOrEqual"/> | ||||
| @@ -55,10 +44,10 @@ | ||||
|       <import plugin="org.eclipse.core.resources" version="3.13.0" match="greaterOrEqual"/> | ||||
|       <import feature="com.opcoach.e4.preferences.feature" version="1.3.0.202004072127"/> | ||||
|       <import feature="org.eclipse.equinox.executable" version="3.8.700.v20200207-2156"/> | ||||
|       <import feature="org.eclipse.equinox.sdk" version="3.20.100.v20200303-1901"/> | ||||
|       <import feature="org.eclipse.sdk" version="4.15.0.v20200305-0155"/> | ||||
|       <import feature="org.eclipse.rcptt.core" version="2.5.1.M3"/> | ||||
|       <import plugin="org.eclipse.core.commands"/> | ||||
|       <import feature="com.minres.scviewer.database.feature" version="3.0.0.qualifier"/> | ||||
|       <import feature="com.minres.scviewer.ui.feature" version="1.1.0.qualifier"/> | ||||
|    </requires> | ||||
|  | ||||
|    <plugin | ||||
|   | ||||
| @@ -5,8 +5,8 @@ | ||||
|   <parent> | ||||
|   	<groupId>com.minres.scviewer</groupId> | ||||
|   	<artifactId>com.minres.scviewer.parent</artifactId> | ||||
|   	<version>2.0.0-SNAPSHOT</version> | ||||
|   	<version>2.15.1</version> | ||||
| 	<relativePath>../..</relativePath> | ||||
|   </parent> | ||||
|   <version>1.0.0-SNAPSHOT</version> | ||||
|   <version>1.1.0-SNAPSHOT</version> | ||||
| </project> | ||||
|   | ||||
| @@ -29,10 +29,17 @@ | ||||
|          id="org.eclipse.emf.common" | ||||
|          version="0.0.0"/> | ||||
|  | ||||
|    <includes | ||||
|          id="org.eclipse.collections.feature" | ||||
|          version="0.0.0"/> | ||||
|  | ||||
|    <requires> | ||||
|       <import plugin="org.eclipse.core.expressions" version="3.2.0" match="compatible"/> | ||||
|       <import plugin="org.eclipse.core.filesystem" version="1.3.0" match="compatible"/> | ||||
|       <import plugin="org.eclipse.core.runtime" version="3.12.0" match="compatible"/> | ||||
|       <import plugin="org.eclipse.equinox.common" version="3.2.0" match="compatible"/> | ||||
|       <import plugin="org.eclipse.equinox.registry" version="3.2.0" match="compatible"/> | ||||
|       <import plugin="org.eclipse.osgi" version="3.2.0" match="compatible"/> | ||||
|    </requires> | ||||
|  | ||||
|    <plugin | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|   <parent> | ||||
|   	<groupId>com.minres.scviewer</groupId> | ||||
|   	<artifactId>com.minres.scviewer.parent</artifactId> | ||||
|   	<version>2.0.0-SNAPSHOT</version> | ||||
|   	<version>2.15.1</version> | ||||
| 	<relativePath>../..</relativePath> | ||||
|   </parent> | ||||
|   <version>1.0.0-SNAPSHOT</version> | ||||
|   | ||||
| @@ -1,2 +1,4 @@ | ||||
| bin.includes = feature.xml,\ | ||||
|                feature.properties | ||||
| src.includes = feature.properties,\ | ||||
|                feature.xml | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| <feature | ||||
|       id="com.minres.scviewer.feature" | ||||
|       label="%featureName" | ||||
|       version="1.0.0.qualifier" | ||||
|       version="1.1.0.qualifier" | ||||
|       provider-name="%providerName"> | ||||
|  | ||||
|    <description> | ||||
| @@ -12,7 +12,7 @@ built-in text base recording. | ||||
|    </description> | ||||
|  | ||||
|    <copyright> | ||||
|       Copyright (c) 2015 MINRES Technologies GmbH. | ||||
|       Copyright (c) 2015-2021 MINRES Technologies GmbH. | ||||
| All rights reserved. This program and the accompanying materials | ||||
| are made available under the terms of the Eclipse Public License | ||||
| v1.0 which accompanies this distribution, and is available at  | ||||
| @@ -24,22 +24,11 @@ http://www.eclipse.org/legal/epl-v10.html | ||||
|    </license> | ||||
|  | ||||
|    <url> | ||||
|       <update label="%updateSiteName" url="http://www.minres.com/scviewer/update"/> | ||||
|       <discovery label="MINRES Website" url="http://www.minres.com"/> | ||||
|    </url> | ||||
|  | ||||
|    <includes | ||||
|          id="com.minres.scviewer.database.feature" | ||||
|          version="0.0.0"/> | ||||
|  | ||||
|    <includes | ||||
|          id="com.minres.scviewer.ui.feature" | ||||
|          version="0.0.0"/> | ||||
|  | ||||
|    <requires> | ||||
|       <import plugin="org.hamcrest.core" version="1.3.0" match="greaterOrEqual"/> | ||||
|       <import plugin="com.minres.scviewer.database" version="1.0.0" match="greaterOrEqual"/> | ||||
|       <import plugin="com.minres.scviewer.database.ui.swt" version="1.0.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.core.runtime"/> | ||||
|       <import plugin="org.eclipse.core.resources"/> | ||||
|       <import plugin="org.eclipse.jface.text"/> | ||||
| @@ -51,7 +40,8 @@ http://www.eclipse.org/legal/epl-v10.html | ||||
|       <import plugin="org.eclipse.osgi"/> | ||||
|       <import plugin="org.eclipse.core.expressions" version="3.4.600" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.jface"/> | ||||
|       <import plugin="com.google.guava" version="15.0.0" match="greaterOrEqual"/> | ||||
|       <import feature="com.minres.scviewer.database.feature" version="3.0.0.qualifier"/> | ||||
|       <import feature="com.minres.scviewer.ui.feature" version="1.1.0.qualifier"/> | ||||
|    </requires> | ||||
|  | ||||
|    <plugin | ||||
|   | ||||
| @@ -5,8 +5,8 @@ | ||||
|   <parent> | ||||
|   	<groupId>com.minres.scviewer</groupId> | ||||
|   	<artifactId>com.minres.scviewer.parent</artifactId> | ||||
|   	<version>2.0.0-SNAPSHOT</version> | ||||
|   	<version>2.15.1</version> | ||||
| 	<relativePath>../..</relativePath> | ||||
|   </parent> | ||||
|   <version>1.0.0-SNAPSHOT</version> | ||||
|   <version>1.1.0-SNAPSHOT</version> | ||||
| </project> | ||||
|   | ||||
| @@ -1 +1,4 @@ | ||||
| bin.includes = feature.xml | ||||
| bin.includes = feature.xml,\ | ||||
|                feature.properties | ||||
| src.includes = feature.properties,\ | ||||
|                feature.xml | ||||
|   | ||||
							
								
								
									
										102
									
								
								features/com.minres.scviewer.ui.feature/feature.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								features/com.minres.scviewer.ui.feature/feature.properties
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,102 @@ | ||||
| featureName=SCViewer UI elements | ||||
| providerName=MINRES Technologies GmbH | ||||
| updateSiteName=SC Viewer UI Updates | ||||
| description=A viewer for SystemC Verification Library transactions and VCD signals. | ||||
| licenseURL=license.html | ||||
| 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 | ||||
| @@ -1,34 +1,37 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <feature | ||||
|       id="com.minres.scviewer.ui.feature" | ||||
|       label="SCViewer UI" | ||||
|       version="1.0.0.qualifier" | ||||
|       provider-name="MINRES Technologies GmbH"> | ||||
|       label="%featureName" | ||||
|       version="1.1.0.qualifier" | ||||
|       provider-name="%providerName"> | ||||
|  | ||||
|    <description url="http://www.example.com/description"> | ||||
|       [Enter Feature Description here.] | ||||
|    <description> | ||||
|       The UI for the SCViewer databases | ||||
|    </description> | ||||
|  | ||||
|    <copyright url="http://www.example.com/copyright"> | ||||
|       [Enter Copyright Description here.] | ||||
|    <copyright> | ||||
|       Copyright (c) 2015-2021 MINRES Technologies GmbH. | ||||
| All rights reserved. This program and the accompanying materials | ||||
| are made available under the terms of the Eclipse Public License | ||||
| v1.0 which accompanies this distribution, and is available at | ||||
| http://www.eclipse.org/legal/epl-v10.html | ||||
|    </copyright> | ||||
|  | ||||
|    <license url="http://www.example.com/license"> | ||||
|       [Enter License Description here.] | ||||
|    <license url="%licenseURL"> | ||||
|       %license | ||||
|    </license> | ||||
|  | ||||
|    <includes | ||||
|          id="com.minres.scviewer.database.feature" | ||||
|          version="0.0.0"/> | ||||
|    <url> | ||||
|       <discovery label="MINRES Website" url="http://www.minres.com"/> | ||||
|    </url> | ||||
|  | ||||
|    <requires> | ||||
|       <import plugin="org.eclipse.swt" version="3.103.1" match="greaterOrEqual"/> | ||||
|       <import plugin="com.minres.scviewer.database" version="1.0.0" match="greaterOrEqual"/> | ||||
|       <import plugin="com.google.guava" version="15.0.0" match="greaterOrEqual"/> | ||||
|       <import plugin="org.eclipse.jface"/> | ||||
|       <import plugin="org.eclipse.equinox.registry"/> | ||||
|       <import plugin="org.eclipse.core.runtime"/> | ||||
|       <import plugin="org.eclipse.osgi"/> | ||||
|       <import feature="com.minres.scviewer.database.feature" version="3.0.0.qualifier"/> | ||||
|    </requires> | ||||
|  | ||||
|    <plugin | ||||
|   | ||||
| @@ -5,8 +5,8 @@ | ||||
|   <parent> | ||||
|   	<groupId>com.minres.scviewer</groupId> | ||||
|   	<artifactId>com.minres.scviewer.parent</artifactId> | ||||
|   	<version>2.0.0-SNAPSHOT</version> | ||||
|   	<version>2.15.1</version> | ||||
| 	<relativePath>../..</relativePath> | ||||
|   </parent> | ||||
|   <version>1.0.0-SNAPSHOT</version> | ||||
|   <version>1.1.0-SNAPSHOT</version> | ||||
| </project> | ||||
|   | ||||
| @@ -1,4 +0,0 @@ | ||||
| activeProfiles= | ||||
| eclipse.preferences.version=1 | ||||
| resolveWorkspaceProjects=true | ||||
| version=1 | ||||
| @@ -1,15 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <site> | ||||
|    <feature url="features/com.minres.scviewer.feature_1.0.0.qualifier.jar" id="com.minres.scviewer.feature" version="1.0.0.qualifier"> | ||||
|       <category name="com.minres.scviewer"/> | ||||
|    </feature> | ||||
|    <feature id="com.minres.scviewer.e4.feature"> | ||||
|       <category name="com.minres.scviewer.e4"/> | ||||
|    </feature> | ||||
|    <category-def name="com.minres.scviewer" label="SCViewer"> | ||||
|       <description> | ||||
|          Viewer for SystemC Verification (SCV) library's transaction recording | ||||
|       </description> | ||||
|    </category-def> | ||||
|    <category-def name="com.minres.scviewer.e4" label="SCViewer E4 application"/> | ||||
| </site> | ||||
| @@ -1,20 +0,0 @@ | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
| 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
| 	<modelVersion>4.0.0</modelVersion> | ||||
| 	<artifactId>com.minres.scviewer.updateSite</artifactId> | ||||
| 	<packaging>eclipse-repository</packaging> | ||||
| 	<parent> | ||||
| 		<groupId>com.minres.scviewer</groupId> | ||||
| 		<artifactId>com.minres.scviewer.parent</artifactId> | ||||
| 		<version>2.0.0-SNAPSHOT</version> | ||||
| 		<relativePath>../..</relativePath> | ||||
| 	</parent> | ||||
| <!--	<build> | ||||
|  		<finalName>resources</finalName> | ||||
| 		<resources> | ||||
| 			<resource> | ||||
| 				<directory>resources</directory> | ||||
| 			</resource> | ||||
| 		</resources> | ||||
| 	</build> --> | ||||
| 	</project> | ||||
| @@ -1,9 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <classpath> | ||||
| 	<classpathentry exported="true" kind="lib" path="json-20180813.jar" sourcepath="json-20180813-sources.jar"/> | ||||
| 	<classpathentry exported="true" kind="lib" path="leveldb-0.11-SNAPSHOT-uber.jar" sourcepath="leveldb-0.11-SNAPSHOT-sources.jar"/> | ||||
| 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> | ||||
| 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> | ||||
| 	<classpathentry kind="src" path="src"/> | ||||
| 	<classpathentry kind="output" path="bin"/> | ||||
| </classpath> | ||||
| @@ -1,4 +0,0 @@ | ||||
| /json-20180813-sources.jar | ||||
| /leveldb-0.11-SNAPSHOT-sources.jar | ||||
| /bin/ | ||||
| /target/ | ||||
| @@ -1,33 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <projectDescription> | ||||
| 	<name>com.minres.scviewer.database.leveldb</name> | ||||
| 	<comment></comment> | ||||
| 	<projects> | ||||
| 	</projects> | ||||
| 	<buildSpec> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.jdt.core.javabuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.pde.ManifestBuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.pde.SchemaBuilder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 		<buildCommand> | ||||
| 			<name>org.eclipse.pde.ds.core.builder</name> | ||||
| 			<arguments> | ||||
| 			</arguments> | ||||
| 		</buildCommand> | ||||
| 	</buildSpec> | ||||
| 	<natures> | ||||
| 		<nature>org.eclipse.pde.PluginNature</nature> | ||||
| 		<nature>org.eclipse.jdt.core.javanature</nature> | ||||
| 	</natures> | ||||
| </projectDescription> | ||||
| @@ -1,7 +0,0 @@ | ||||
| eclipse.preferences.version=1 | ||||
| org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled | ||||
| org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 | ||||
| org.eclipse.jdt.core.compiler.compliance=1.8 | ||||
| org.eclipse.jdt.core.compiler.problem.assertIdentifier=error | ||||
| org.eclipse.jdt.core.compiler.problem.enumIdentifier=error | ||||
| org.eclipse.jdt.core.compiler.source=1.8 | ||||
| @@ -1,4 +0,0 @@ | ||||
| eclipse.preferences.version=1 | ||||
| pluginProject.equinox=false | ||||
| pluginProject.extensions=false | ||||
| resolve.requirebundle=false | ||||
| @@ -1,5 +0,0 @@ | ||||
| eclipse.preferences.version=1 | ||||
| enabled=true | ||||
| path=OSGI-INF | ||||
| validationErrorLevel=error | ||||
| validationErrorLevel.missingImplicitUnbindMethod=error | ||||
| @@ -1,16 +0,0 @@ | ||||
| Manifest-Version: 1.0 | ||||
| Bundle-ManifestVersion: 2 | ||||
| Bundle-Name: Leveldb | ||||
| Bundle-SymbolicName: com.minres.scviewer.database.leveldb | ||||
| Bundle-Version: 1.0.0.qualifier | ||||
| Bundle-Vendor: MINRES Technologies GmbH | ||||
| Bundle-RequiredExecutionEnvironment: JavaSE-1.8 | ||||
| Import-Package: org.osgi.framework;version="1.3.0" | ||||
| Automatic-Module-Name: com.minres.scviewer.database.leveldb | ||||
| Service-Component: OSGI-INF/*.xml | ||||
| Require-Bundle: com.minres.scviewer.database;bundle-version="1.0.0", | ||||
|  org.eclipse.osgi.services;bundle-version="3.4.0" | ||||
| Bundle-ActivationPolicy: lazy | ||||
| Bundle-ClassPath: leveldb-0.11-SNAPSHOT-uber.jar, | ||||
|  ., | ||||
|  json-20180813.jar | ||||
| @@ -1,7 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="LevelDbLoader"> | ||||
|    <implementation class="com.minres.scviewer.database.leveldb.LevelDBLoader"/> | ||||
|    <service> | ||||
|       <provide interface="com.minres.scviewer.database.IWaveformDbLoader"/> | ||||
|    </service> | ||||
| </scr:component> | ||||
| @@ -1,7 +0,0 @@ | ||||
| source.. = src/ | ||||
| output.. = bin/ | ||||
| bin.includes = META-INF/,\ | ||||
|                .,\ | ||||
|                OSGI-INF/,\ | ||||
|                leveldb-0.11-SNAPSHOT-uber.jar,\ | ||||
|                json-20180813.jar | ||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -1,13 +0,0 @@ | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
| 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
| 	<modelVersion>4.0.0</modelVersion> | ||||
| 	<artifactId>com.minres.scviewer.database.leveldb</artifactId> | ||||
| 	<version>1.0.0-SNAPSHOT</version> | ||||
| 	<parent> | ||||
| 		<groupId>com.minres.scviewer</groupId> | ||||
| 		<artifactId>com.minres.scviewer.parent</artifactId> | ||||
| 		<version>2.0.0-SNAPSHOT</version> | ||||
| 		<relativePath>../..</relativePath> | ||||
| 	</parent> | ||||
| 	<packaging>eclipse-plugin</packaging> | ||||
| </project> | ||||
| @@ -1,87 +0,0 @@ | ||||
| package com.minres.scviewer.database.leveldb; | ||||
|  | ||||
| import static java.nio.charset.StandardCharsets.UTF_8; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| import java.util.List; | ||||
| import java.util.Map.Entry; | ||||
|  | ||||
| import org.iq80.leveldb.Options; | ||||
| import org.iq80.leveldb.impl.SeekingIterator; | ||||
| import org.json.JSONObject; | ||||
|  | ||||
| import com.minres.scviewer.database.IWaveform; | ||||
| import com.minres.scviewer.database.IWaveformDb; | ||||
| import com.minres.scviewer.database.IWaveformDbLoader; | ||||
| import com.minres.scviewer.database.RelationType; | ||||
|  | ||||
| public class LevelDBLoader implements IWaveformDbLoader { | ||||
|  | ||||
| 	static byte[] toByteArray(String value) { | ||||
| 		return value.getBytes(UTF_8); | ||||
| 	} | ||||
|  | ||||
| 	private TxDBWrapper levelDb; | ||||
| 	private IWaveformDb db; | ||||
| 	private Long maxTime=null; | ||||
| 	private List<RelationType> usedRelationsList = new ArrayList<>(); | ||||
| 	 | ||||
| 	@Override | ||||
| 	public boolean load(IWaveformDb db, File inp) throws Exception { | ||||
| 		try { | ||||
| 			this.db=db; | ||||
| 			levelDb = new TxDBWrapper(new Options(), inp); | ||||
| 			JSONObject configVal = new JSONObject(levelDb.get("__config")); | ||||
| 			if(!configVal.isEmpty()) | ||||
| 				levelDb.setTimeResolution(configVal.getLong("resolution")); | ||||
| 		} catch(Exception e) { | ||||
| 			return false; | ||||
| 		} | ||||
| 		return true; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Long getMaxTime() { | ||||
| 		if(maxTime==null) { | ||||
| 			SeekingIterator<String, String> it = levelDb.iterator(); | ||||
| 			it.seek("st~"); | ||||
| 			Entry<String, String> val = null; | ||||
| 			while(it.hasNext()) { | ||||
| 				Entry<String, String>  v = it.next(); | ||||
| 				if(!v.getKey().startsWith("st~")) continue; | ||||
| 				val=v; | ||||
| 			} | ||||
| 			if(val==null)  | ||||
| 				maxTime = 0L; | ||||
| 			else { | ||||
| 				String[] token = val.getKey().split("~"); | ||||
| 				maxTime = Long.parseLong(token[2], 16)*levelDb.getTimeResolution(); | ||||
| 			} | ||||
| 		} | ||||
| 		return maxTime; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Collection<IWaveform> getAllWaves() { | ||||
| 		List<IWaveform> streams=new ArrayList<IWaveform>(); | ||||
| 		SeekingIterator<String, String> it = levelDb.iterator(); | ||||
| 		it.seek("s~"); | ||||
| 		while(it.hasNext()) { | ||||
| 			Entry<String, String> val = it.next(); | ||||
| 			if(!val.getKey().startsWith("s~")) break; | ||||
| 			TxStream stream = new TxStream(levelDb, db, new JSONObject(val.getValue())); | ||||
| 			stream.setRelationTypeList(usedRelationsList); | ||||
| 			streams.add(stream); | ||||
| 		} | ||||
| 		return streams; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Collection<RelationType> getAllRelationTypes() { | ||||
| //		return Collections.emptyList(); | ||||
| 		return usedRelationsList; | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -1,51 +0,0 @@ | ||||
| package com.minres.scviewer.database.leveldb; | ||||
|  | ||||
| import static java.nio.charset.StandardCharsets.UTF_8; | ||||
| import static org.iq80.leveldb.shaded.guava.collect.Maps.immutableEntry; | ||||
|  | ||||
| import java.util.Map.Entry; | ||||
|  | ||||
| import org.iq80.leveldb.DBIterator; | ||||
| import org.iq80.leveldb.impl.SeekingIterator; | ||||
|  | ||||
| class StringDbIterator implements SeekingIterator<String, String> { | ||||
| 	private final DBIterator iterator; | ||||
|  | ||||
| 	StringDbIterator(DBIterator iterator) { | ||||
| 		this.iterator = iterator; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public boolean hasNext() { | ||||
| 		return iterator.hasNext(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public void seekToFirst() { | ||||
| 		iterator.seekToFirst(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public void seek(String targetKey) { | ||||
| 		iterator.seek(targetKey.getBytes(UTF_8)); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Entry<String, String> peek() { | ||||
| 		return adapt(iterator.peekNext()); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Entry<String, String> next() { | ||||
| 		return adapt(iterator.next()); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public void remove() { | ||||
| 		throw new UnsupportedOperationException(); | ||||
| 	} | ||||
|  | ||||
| 	private Entry<String, String> adapt(Entry<byte[], byte[]> next) { | ||||
| 		return immutableEntry(new String(next.getKey(), UTF_8), new String(next.getValue(), UTF_8)); | ||||
| 	} | ||||
| } | ||||
| @@ -1,172 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH 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: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.leveldb; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| import java.util.List; | ||||
| import org.iq80.leveldb.impl.SeekingIterator; | ||||
| import org.json.JSONArray; | ||||
| import org.json.JSONException; | ||||
| import org.json.JSONObject; | ||||
|  | ||||
| import com.minres.scviewer.database.ITx; | ||||
| import com.minres.scviewer.database.ITxAttribute; | ||||
| import com.minres.scviewer.database.ITxEvent; | ||||
| import com.minres.scviewer.database.ITxGenerator; | ||||
| import com.minres.scviewer.database.ITxRelation; | ||||
| import com.minres.scviewer.database.ITxStream; | ||||
|  | ||||
| public class Tx implements ITx { | ||||
|  | ||||
| 	private TxDBWrapper levelDb; | ||||
| 	private TxStream trStream; | ||||
| 	private TxGenerator trGenerator; | ||||
| 	private long id; | ||||
| 	private long start_time=0; | ||||
| 	private long end_time=0; | ||||
| 	private int concurency_index; | ||||
| 	private boolean initialized=false; | ||||
| 	private List<ITxAttribute> attributes; | ||||
| 	private List<ITxRelation> incoming, outgoing; | ||||
| 	 | ||||
| 	public Tx(TxDBWrapper levelDb, TxStream trStream, TxGenerator trGenerator, long id) { | ||||
| 		this.levelDb=levelDb; | ||||
| 		this.trStream=trStream; | ||||
| 		this.trGenerator=trGenerator; | ||||
| 		this.id=id; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Long getId() { | ||||
| 		return id; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public ITxStream<ITxEvent> getStream() { | ||||
| 		return trStream; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public ITxGenerator getGenerator() { | ||||
| 		return trGenerator; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public int getConcurrencyIndex() { | ||||
| 		if(!initialized) loadFromDb(); | ||||
| 		return concurency_index; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Long getBeginTime() { | ||||
| 		if(!initialized) loadFromDb(); | ||||
| 		return start_time; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Long getEndTime() { | ||||
| 		loadFromDb(); | ||||
| 		return end_time; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public List<ITxAttribute> getAttributes() { | ||||
| 		if(attributes==null) { | ||||
| 			loadFromDb(); | ||||
| 		} | ||||
| 		return attributes; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Collection<ITxRelation> getIncomingRelations() { | ||||
| 		if(incoming==null) { | ||||
| 			incoming = new ArrayList<ITxRelation>(); | ||||
| 			SeekingIterator<String, String> it = levelDb.iterator(); | ||||
| 			String key = "ri~"+String.format("%016x", id); | ||||
| 			it.seek(key); | ||||
| 			while(it.hasNext()) { | ||||
| 				String val = it.next().getKey(); | ||||
| 				if(!val.startsWith(key)) break;; | ||||
| 				String[] token = val.split("~"); | ||||
| 				long otherId = Long.parseLong(token[2], 16); | ||||
| 				incoming.add(createRelation(otherId, token[3], false)); | ||||
| 			} | ||||
|  | ||||
| 		} | ||||
| 		return incoming; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Collection<ITxRelation> getOutgoingRelations() { | ||||
| 		if(outgoing==null) { | ||||
| 			outgoing = new ArrayList<ITxRelation>(); | ||||
| 			SeekingIterator<String, String> it = levelDb.iterator(); | ||||
| 			String key="ro~"+String.format("%016x", id); | ||||
| 			it.seek(key); | ||||
| 			while(it.hasNext()) { | ||||
| 				String val = it.next().getKey(); | ||||
| 				if(!val.startsWith(key)) break; | ||||
| 				String[] token = val.split("~"); | ||||
| 				long otherId = Long.parseLong(token[2], 16); | ||||
| 				outgoing.add(createRelation(otherId, token[3], true)); | ||||
| 			} | ||||
|  | ||||
| 		} | ||||
| 		return outgoing; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public int compareTo(ITx o) { | ||||
| 		int res = this.getBeginTime().compareTo(o.getBeginTime()); | ||||
| 		if(res!=0)	 | ||||
| 			return res; | ||||
| 		else | ||||
| 			return this.getId().compareTo(o.getId()); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String toString() { | ||||
| 		return "tx#"+getId()+"["+getBeginTime()/1000000+"ns - "+getEndTime()/1000000+"ns]"; | ||||
| 	} | ||||
| 	 | ||||
| 	private void loadFromDb() throws JSONException { | ||||
| 		JSONObject dbVal = new JSONObject(levelDb.get("x~"+ String.format("%016x", id))); | ||||
| 		start_time=dbVal.getLong("START_TIME") * levelDb.getTimeResolution(); | ||||
| 		end_time=dbVal.getLong("END_TIME") * levelDb.getTimeResolution(); | ||||
| 		concurency_index=dbVal.getInt("conc"); | ||||
| 		attributes=new ArrayList<>(); | ||||
| 		JSONArray arr = dbVal.getJSONArray("attr"); | ||||
| 		arr.forEach(entry -> { | ||||
| 			TxAttribute attr = new TxAttribute(this, (JSONObject) entry); | ||||
| 			attributes.add(attr); | ||||
| 		}); | ||||
| 		initialized=true; | ||||
| 	} | ||||
|  | ||||
| 	private ITxRelation createRelation(long otherId, String name, boolean outgoing) { | ||||
| 		try { | ||||
| 			JSONObject otherTxVal = new JSONObject(levelDb.get("x~"+ String.format("%016x", otherId))); | ||||
| 			if(otherTxVal.isEmpty()) return null; | ||||
| 			JSONObject otherStreamVal = new JSONObject(levelDb.get("s~"+ String.format("%016x", otherTxVal.getLong("s")))); | ||||
| 			if(otherStreamVal.isEmpty()) return null; | ||||
| 			TxStream tgtStream = (TxStream) trStream.getDb().getStreamByName(otherStreamVal.getString("name")); | ||||
| 			Tx that = (Tx) tgtStream.getTransactions().get(otherId); | ||||
| 			return outgoing? | ||||
| 					new TxRelation(trStream.getRelationType(name), this, that): | ||||
| 						new TxRelation(trStream.getRelationType(name), that, this); | ||||
| 		} catch (SecurityException | IllegalArgumentException | JSONException e) { | ||||
| 			e.printStackTrace(); | ||||
| 		} | ||||
| 		return null;		 | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -1,56 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH 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: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.leveldb; | ||||
|  | ||||
| import org.json.JSONObject; | ||||
|  | ||||
| import com.minres.scviewer.database.AssociationType; | ||||
| import com.minres.scviewer.database.DataType; | ||||
| import com.minres.scviewer.database.ITxAttribute; | ||||
|  | ||||
| public class TxAttribute implements ITxAttribute{ | ||||
|  | ||||
| 	private String name; | ||||
| 	 | ||||
| 	private DataType dataType; | ||||
| 	 | ||||
| 	private AssociationType associationType; | ||||
|  | ||||
| 	private Object value; | ||||
| 	 | ||||
| 	public TxAttribute(Tx trTransaction, JSONObject attribute) { | ||||
| 		this.name=attribute.getString("name"); | ||||
| 		this.dataType=DataType.values()[attribute.getInt("type")]; | ||||
| 		this.associationType=AssociationType.values()[attribute.getInt("assoc")]; | ||||
| 		this.value=attribute.get("value"); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getName() { | ||||
| 		return name; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public DataType getDataType() { | ||||
| 		return dataType; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public AssociationType getType() { | ||||
| 		return associationType; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Object getValue() { | ||||
| 		return value; | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -1,90 +0,0 @@ | ||||
| package com.minres.scviewer.database.leveldb; | ||||
|  | ||||
| import static java.nio.charset.StandardCharsets.UTF_8; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
|  | ||||
| import org.iq80.leveldb.Options; | ||||
| import org.iq80.leveldb.Range; | ||||
| import org.iq80.leveldb.ReadOptions; | ||||
| import org.iq80.leveldb.Snapshot; | ||||
| import org.iq80.leveldb.impl.DbImpl; | ||||
| import org.iq80.leveldb.impl.SeekingIterator; | ||||
|  | ||||
| class TxDBWrapper { | ||||
| 	private final Options options; | ||||
| 	private final ReadOptions ro = new ReadOptions(); | ||||
| 	private final File databaseDir; | ||||
| 	private DbImpl db; | ||||
| 	private long timeResolution=1L;; | ||||
|  | ||||
| 	TxDBWrapper(Options options, File databaseDir) throws IOException { | ||||
| 		this.options = options.verifyChecksums(true).createIfMissing(false).errorIfExists(false).cacheSize(64*1024*1024); | ||||
| 		this.databaseDir = databaseDir; | ||||
| 		this.db = new DbImpl(options, databaseDir); | ||||
| 		ro.snapshot(db.getSnapshot()); | ||||
| 	} | ||||
|  | ||||
| 	public String get(String key) { | ||||
| 		byte[] slice = db.get(LevelDBLoader.toByteArray(key)); | ||||
| 		if (slice == null) { | ||||
| 			return null; | ||||
| 		} | ||||
| 		return new String(slice, UTF_8); | ||||
| 	} | ||||
|  | ||||
| 	public String get(String key, Snapshot snapshot) { | ||||
| 		byte[] slice = db.get(LevelDBLoader.toByteArray(key), ro); | ||||
| 		return slice == null? null : new String(slice, UTF_8); | ||||
| 	} | ||||
|  | ||||
| 	public void put(String key, String value) { | ||||
| 		db.put(LevelDBLoader.toByteArray(key), LevelDBLoader.toByteArray(value)); | ||||
| 	} | ||||
|  | ||||
| 	public void delete(String key) { | ||||
| 		db.delete(LevelDBLoader.toByteArray(key)); | ||||
| 	} | ||||
|  | ||||
| 	public SeekingIterator<String, String> iterator() { | ||||
| 		return new StringDbIterator(db.iterator()); | ||||
| 	} | ||||
|  | ||||
| 	public Snapshot getSnapshot() { | ||||
| 		return db.getSnapshot(); | ||||
| 	} | ||||
|  | ||||
| 	public void close() { | ||||
| 		try { | ||||
| 			ro.snapshot().close(); | ||||
| 			db.close(); | ||||
| 		} catch (IOException e) {} // ignore any error | ||||
| 	} | ||||
|  | ||||
| 	public long size(String start, String limit) { | ||||
| 		return db.getApproximateSizes(new Range(LevelDBLoader.toByteArray(start), LevelDBLoader.toByteArray(limit))); | ||||
| 	} | ||||
|  | ||||
| 	public long getMaxNextLevelOverlappingBytes() { | ||||
| 		return db.getMaxNextLevelOverlappingBytes(); | ||||
| 	} | ||||
|  | ||||
| 	public void reopen() throws IOException { | ||||
| 		reopen(options); | ||||
| 	} | ||||
|  | ||||
| 	public void reopen(Options options) throws IOException { | ||||
| 		this.close(); | ||||
| 		db = new DbImpl(options.verifyChecksums(true).createIfMissing(false).errorIfExists(false), databaseDir); | ||||
| 		ro.snapshot(db.getSnapshot()); | ||||
| 	} | ||||
| 	 | ||||
| 	public long getTimeResolution() { | ||||
| 		return timeResolution; | ||||
| 	} | ||||
| 	 | ||||
| 	public void setTimeResolution(long resolution) { | ||||
| 		this.timeResolution = resolution; | ||||
| 	} | ||||
| } | ||||
| @@ -1,57 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH 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: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.leveldb; | ||||
|  | ||||
| import com.minres.scviewer.database.ITx; | ||||
| import com.minres.scviewer.database.ITxEvent; | ||||
| import com.minres.scviewer.database.IWaveformEvent; | ||||
|  | ||||
| public class TxEvent implements ITxEvent { | ||||
|  | ||||
| 	private final Type type; | ||||
| 	private ITx tx; | ||||
| 	 | ||||
| 	public TxEvent(Type type, ITx tx) { | ||||
| 		super(); | ||||
| 		this.type = type; | ||||
| 		this.tx = tx; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Long getTime() { | ||||
| 		return type==Type.BEGIN?tx.getBeginTime():tx.getEndTime(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public IWaveformEvent duplicate() throws CloneNotSupportedException { | ||||
| 		return new TxEvent(type, tx); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public int compareTo(IWaveformEvent o) { | ||||
| 		return getTime().compareTo(o.getTime()); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public ITx getTransaction() { | ||||
| 		return tx; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Type getType() { | ||||
| 		return type; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String toString() { | ||||
| 		return type.toString()+"@"+getTime()+" of tx #"+tx.getId(); | ||||
| 	} | ||||
| } | ||||
| @@ -1,56 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH 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: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.leveldb; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| import org.json.JSONObject; | ||||
|  | ||||
| import com.minres.scviewer.database.ITx; | ||||
| import com.minres.scviewer.database.ITxEvent; | ||||
| import com.minres.scviewer.database.ITxGenerator; | ||||
| import com.minres.scviewer.database.ITxStream; | ||||
|  | ||||
| public class TxGenerator implements ITxGenerator { | ||||
|  | ||||
| 	private ITxStream<ITxEvent>  stream; | ||||
| 	 | ||||
| 	private long id; | ||||
| 	 | ||||
| 	private String name; | ||||
|  | ||||
| 	public TxGenerator(ITxStream<ITxEvent>  stream, JSONObject object) { | ||||
| 		this.stream=stream; | ||||
| 		this.id=object.getLong("id"); | ||||
| 		this.name=object.getString("name"); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Long getId() { | ||||
| 		return id; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public ITxStream<ITxEvent> getStream() { | ||||
| 		return stream; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getName() { | ||||
| 		return name; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public List<ITx> getTransactions() { | ||||
| 		return null; | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -1,43 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH 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: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.leveldb; | ||||
|  | ||||
| import com.minres.scviewer.database.ITxRelation; | ||||
| import com.minres.scviewer.database.ITx; | ||||
| import com.minres.scviewer.database.RelationType; | ||||
|  | ||||
| public class TxRelation implements ITxRelation { | ||||
|  | ||||
| 	RelationType relationType; | ||||
| 	Tx source, target; | ||||
|  | ||||
| 	public TxRelation(RelationType relationType, Tx source, Tx target) { | ||||
| 		this.source = source; | ||||
| 		this.target = target; | ||||
| 		this.relationType = relationType; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public RelationType getRelationType() { | ||||
| 		return relationType; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public ITx getSource() { | ||||
| 		return source; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public ITx getTarget() { | ||||
| 		return target; | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -1,178 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH 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: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.leveldb; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Map.Entry; | ||||
|  | ||||
| import org.iq80.leveldb.impl.SeekingIterator; | ||||
| import org.json.JSONObject; | ||||
|  | ||||
| import java.util.NavigableMap; | ||||
| import java.util.TreeMap; | ||||
| import java.util.Vector; | ||||
|  | ||||
| import com.minres.scviewer.database.HierNode; | ||||
| import com.minres.scviewer.database.ITx; | ||||
| import com.minres.scviewer.database.ITxEvent; | ||||
| import com.minres.scviewer.database.ITxGenerator; | ||||
| import com.minres.scviewer.database.ITxStream; | ||||
| import com.minres.scviewer.database.IWaveform; | ||||
| import com.minres.scviewer.database.IWaveformDb; | ||||
| import com.minres.scviewer.database.RelationType; | ||||
|  | ||||
| public class TxStream extends HierNode implements ITxStream<ITxEvent> { | ||||
|  | ||||
| 	private TxDBWrapper levelDb; | ||||
|  | ||||
| 	private String fullName; | ||||
| 	 | ||||
| 	private String kind; | ||||
|  | ||||
| 	private IWaveformDb db; | ||||
| 		 | ||||
| 	private long id; | ||||
| 	 | ||||
| 	private TreeMap<Long, TxGenerator> generators; | ||||
| 	 | ||||
| 	private TreeMap<Long, ITx> transactions; | ||||
| 	 | ||||
| 	private Integer maxConcurrency; | ||||
| 	 | ||||
| 	private TreeMap<Long, List<ITxEvent>> events; | ||||
|  | ||||
| 	private List<RelationType> usedRelationsList; | ||||
| 	 | ||||
| 	public TxStream(TxDBWrapper database, IWaveformDb waveformDb, JSONObject object) { | ||||
| 		super(object.get("name").toString()); | ||||
| 		this.levelDb=database; | ||||
| 		this.db=waveformDb; | ||||
| 		this.fullName=object.getString("name"); | ||||
| 		this.kind=object.getString("kind"); | ||||
| 		this.id = object.getLong("id"); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public IWaveformDb getDb() { | ||||
| 		return db; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getFullName() { | ||||
| 		return fullName; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Long getId() { | ||||
| 		return id; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getKind() { | ||||
| 		return kind; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public List<ITxGenerator> getGenerators() { | ||||
| 		if(generators==null){ | ||||
| 			generators=new TreeMap<Long, TxGenerator>(); | ||||
| 			SeekingIterator<String, String> it = levelDb.iterator(); | ||||
| 			String key="sg~"+String.format("%016x", id); | ||||
| 			it.seek(key); | ||||
| 			while(it.hasNext()) { | ||||
| 				Entry<String, String> val = it.next(); | ||||
| 				if(!val.getKey().startsWith(key)) break; | ||||
| 				JSONObject jVal = new JSONObject(val.getValue()); | ||||
| 				generators.put(jVal.getLong("id"), new TxGenerator(this, jVal)); | ||||
| 			} | ||||
| 		} | ||||
| 		return new ArrayList<ITxGenerator>(generators.values()); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public int getMaxConcurrency() { | ||||
| 		if(maxConcurrency==null){ | ||||
| 				getTransactions(); | ||||
| 		} | ||||
| 		return maxConcurrency; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public  NavigableMap<Long, List<ITxEvent>> getEvents(){ | ||||
| 		if(events==null){ | ||||
| 			events=new TreeMap<Long, List<ITxEvent>>(); | ||||
| 			for(Entry<Long, ITx> entry:getTransactions().entrySet()){ | ||||
| 				ITx tx = entry.getValue(); | ||||
| 				putEvent(new TxEvent(TxEvent.Type.BEGIN, tx)); | ||||
| 				putEvent(new TxEvent(TxEvent.Type.END, tx)); | ||||
| 			}	 | ||||
| 		} | ||||
| 		return events; | ||||
| 	} | ||||
|  | ||||
| 	private void putEvent(TxEvent ev){ | ||||
| 		Long time = ev.getTime(); | ||||
| 		if(!events.containsKey(time)){ | ||||
| 			Vector<ITxEvent> vector=new Vector<ITxEvent>(); | ||||
| 			vector.add(ev); | ||||
| 			events.put(time,  vector); | ||||
| 		} else { | ||||
| 			events.get(time).add(ev); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	protected Map<Long, ITx> getTransactions() { | ||||
| 		if(transactions==null){ | ||||
| 			if(generators==null) getGenerators(); | ||||
| 			transactions = new TreeMap<Long, ITx>(); | ||||
| 			maxConcurrency=0; | ||||
| 			SeekingIterator<String, String> it = levelDb.iterator(); | ||||
| 			String key = "sgx~"+String.format("%016x", id); | ||||
| 			it.seek(key); | ||||
| 			while(it.hasNext()) { | ||||
| 				Entry<String, String> val = it.next(); | ||||
| 				if(!val.getKey().startsWith(key)) break; | ||||
| 				String[] token = val.getKey().split("~"); | ||||
| 				long gid = Long.parseLong(token[2], 16); // gen id | ||||
| 				long id = Long.parseLong(token[3], 16); // tx id | ||||
| 				ITx tx = new Tx(levelDb, this, generators.get(gid), id); | ||||
| 				transactions.put(id, tx); | ||||
| 				maxConcurrency= Math.max(maxConcurrency, tx.getConcurrencyIndex()); | ||||
| 			} | ||||
| 			maxConcurrency++; | ||||
| 		} | ||||
| 		return transactions; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Collection<ITxEvent> getWaveformEventsAtTime(Long time) { | ||||
| 		return getEvents().get(time); | ||||
| 	} | ||||
|  | ||||
| 	public void setRelationTypeList(List<RelationType> usedRelationsList){ | ||||
| 		this.usedRelationsList=usedRelationsList; | ||||
| 	} | ||||
| 	 | ||||
| 	public RelationType getRelationType(String name) { | ||||
| 		RelationType relType=RelationType.create(name); | ||||
| 		if(!usedRelationsList.contains(relType)) usedRelationsList.add(relType); | ||||
| 		return relType; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Boolean equals(IWaveform other) { | ||||
| 		return(other instanceof TxStream && this.getId()==other.getId()); | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -1,6 +1,6 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <classpath> | ||||
| 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> | ||||
| 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/> | ||||
| 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> | ||||
| 	<classpathentry kind="src" path="src"/> | ||||
| 	<classpathentry exported="true" kind="lib" path="sqlite-jdbc-3.8.7.jar"/> | ||||
|   | ||||
| @@ -1,8 +1,10 @@ | ||||
| eclipse.preferences.version=1 | ||||
| org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled | ||||
| org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 | ||||
| org.eclipse.jdt.core.compiler.compliance=1.8 | ||||
| org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 | ||||
| org.eclipse.jdt.core.compiler.compliance=11 | ||||
| org.eclipse.jdt.core.compiler.problem.assertIdentifier=error | ||||
| org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled | ||||
| org.eclipse.jdt.core.compiler.problem.enumIdentifier=error | ||||
| org.eclipse.jdt.core.compiler.release=disabled | ||||
| org.eclipse.jdt.core.compiler.source=1.8 | ||||
| org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning | ||||
| org.eclipse.jdt.core.compiler.release=enabled | ||||
| org.eclipse.jdt.core.compiler.source=11 | ||||
|   | ||||
| @@ -2,9 +2,9 @@ Manifest-Version: 1.0 | ||||
| Bundle-ManifestVersion: 2 | ||||
| Bundle-Name: SQLite transaction database | ||||
| Bundle-SymbolicName: com.minres.scviewer.database.sqlite | ||||
| Bundle-Version: 1.0.0.qualifier | ||||
| Bundle-Version: 1.1.0.qualifier | ||||
| Bundle-Vendor: MINRES Technologies GmbH | ||||
| Bundle-RequiredExecutionEnvironment: JavaSE-1.8 | ||||
| Bundle-RequiredExecutionEnvironment: JavaSE-11 | ||||
| Require-Bundle: com.minres.scviewer.database;bundle-version="1.0.0" | ||||
| Bundle-ClassPath: .,sqlite-jdbc-3.8.7.jar | ||||
| Service-Component: OSGI-INF/component.xml | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| ############################################################################### | ||||
| # Copyright (c) 2014, 2015 MINRES Technologies GmbH and others. | ||||
| # Copyright (c) 2014, 2015-2021 MINRES Technologies GmbH 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 | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|   <parent> | ||||
|   	<groupId>com.minres.scviewer</groupId> | ||||
|   	<artifactId>com.minres.scviewer.parent</artifactId> | ||||
|   	<version>2.0.0-SNAPSHOT</version> | ||||
|   	<version>2.15.1</version> | ||||
| 	<relativePath>../..</relativePath> | ||||
|   </parent> | ||||
|   <packaging>eclipse-plugin</packaging> | ||||
| @@ -15,5 +15,5 @@ | ||||
|   		<version>3.8.7</version> | ||||
|   	</dependency> | ||||
|   </dependencies> | ||||
|   <version>1.0.0-SNAPSHOT</version> | ||||
|   <version>1.1.0-SNAPSHOT</version> | ||||
| </project> | ||||
|   | ||||
| @@ -0,0 +1,128 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015-2021 MINRES Technologies GmbH 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: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.sqlite; | ||||
|  | ||||
| import java.sql.SQLException; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Map.Entry; | ||||
|  | ||||
| import com.minres.scviewer.database.EventEntry; | ||||
| import com.minres.scviewer.database.EventKind; | ||||
| import com.minres.scviewer.database.HierNode; | ||||
| import com.minres.scviewer.database.IEvent; | ||||
| import com.minres.scviewer.database.IEventList; | ||||
| import com.minres.scviewer.database.EventList; | ||||
| import com.minres.scviewer.database.IWaveform; | ||||
| import com.minres.scviewer.database.RelationType; | ||||
| import com.minres.scviewer.database.RelationTypeFactory; | ||||
| import com.minres.scviewer.database.WaveformType; | ||||
| import com.minres.scviewer.database.sqlite.db.IDatabase; | ||||
| import com.minres.scviewer.database.tx.ITx; | ||||
|  | ||||
| abstract class AbstractTxStream extends HierNode implements IWaveform { | ||||
|  | ||||
| 	protected IDatabase database; | ||||
|  | ||||
| 	private long streamId; | ||||
| 	 | ||||
| 	private Integer maxConcurrency; | ||||
|  | ||||
| 	private IEventList events; | ||||
|  | ||||
| 	private List<RelationType> usedRelationsList; | ||||
|  | ||||
| 	protected AbstractTxStream(IDatabase database, String name, long streamId) { | ||||
| 		super(name); | ||||
| 		this.database=database; | ||||
| 		this.streamId=streamId; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public int getRowCount() { | ||||
| 		if(maxConcurrency==null){ | ||||
| 			StringBuilder sb = new StringBuilder(); | ||||
| 			sb.append("SELECT MAX(concurrencyLevel) as concurrencyLevel FROM ScvTx where stream="); | ||||
| 			sb.append(streamId); | ||||
| 			try( | ||||
| 					java.sql.Connection connection = database.createConnection(); | ||||
| 					java.sql.Statement statement = connection.createStatement(); | ||||
| 					java.sql.ResultSet resultSet = statement.executeQuery(sb.toString()); | ||||
| 					) { | ||||
| 				while (resultSet.next()) { | ||||
| 					if(maxConcurrency==null) maxConcurrency=0; | ||||
| 					Object value = resultSet.getObject("concurrencyLevel"); | ||||
| 					if(value!=null) | ||||
| 						maxConcurrency=(Integer) value; | ||||
| 				} | ||||
| 			} catch (SQLException e) { | ||||
| 				if(maxConcurrency==null) maxConcurrency=0; | ||||
| 			} | ||||
| 			maxConcurrency+=1; | ||||
| 		} | ||||
| 		return maxConcurrency; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public  IEventList getEvents(){ | ||||
| 		if(events==null){ | ||||
| 			events=new EventList(); | ||||
| 			for(Entry<Integer, ITx> entry:getTransactions().entrySet()){ | ||||
| 				putEvent(new TxEvent(EventKind.BEGIN, entry.getValue())); | ||||
| 				putEvent(new TxEvent(EventKind.END, entry.getValue())); | ||||
| 			}	 | ||||
| 		} | ||||
| 		return events; | ||||
| 	} | ||||
|  | ||||
| 	private void putEvent(TxEvent ev){ | ||||
| 		events.put(ev.getTime(), ev); | ||||
| 	} | ||||
|  | ||||
| 	protected abstract Map<Integer, ITx> getTransactions(); | ||||
|  | ||||
| 	@Override | ||||
| 	public IEvent[] getEventsAtTime(long time) { | ||||
| 		return getEvents().get(time); | ||||
| 	} | ||||
|  | ||||
| 	public void setRelationTypeList(List<RelationType> usedRelationsList){ | ||||
| 		this.usedRelationsList=usedRelationsList; | ||||
| 	} | ||||
|  | ||||
| 	public RelationType getRelationType(String name) { | ||||
| 		RelationType relType=RelationTypeFactory.create(name); | ||||
| 		if(!usedRelationsList.contains(relType)) usedRelationsList.add(relType); | ||||
| 		return relType; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public IEvent[] getEventsBeforeTime(long time) { | ||||
| 		EventEntry e = events.floorEntry(time); | ||||
| 		if(e==null) | ||||
| 			return new IEvent[]{}; | ||||
| 		else | ||||
| 			return  events.floorEntry(time).events; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public WaveformType getType() { | ||||
| 		return WaveformType.TRANSACTION; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Calculate concurrency. | ||||
| 	 */ | ||||
| 	public void calculateConcurrency() { | ||||
| 	} | ||||
|  | ||||
|  | ||||
| } | ||||
| @@ -1,5 +1,5 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * Copyright (c) 2015-2021 MINRES Technologies GmbH 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 | ||||
| @@ -11,10 +11,11 @@ | ||||
| package com.minres.scviewer.database.sqlite; | ||||
|  | ||||
| import java.beans.IntrospectionException; | ||||
| import java.beans.PropertyChangeListener; | ||||
| import java.beans.PropertyChangeSupport; | ||||
| import java.io.File; | ||||
| import java.io.FileInputStream; | ||||
| import java.io.FileNotFoundException; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.sql.SQLException; | ||||
| import java.util.ArrayList; | ||||
| @@ -24,6 +25,7 @@ import java.util.List; | ||||
| import com.minres.scviewer.database.IWaveform; | ||||
| import com.minres.scviewer.database.IWaveformDb; | ||||
| import com.minres.scviewer.database.IWaveformDbLoader; | ||||
| import com.minres.scviewer.database.InputFormatException; | ||||
| import com.minres.scviewer.database.RelationType; | ||||
| import com.minres.scviewer.database.sqlite.db.IDatabase; | ||||
| import com.minres.scviewer.database.sqlite.db.SQLiteDatabase; | ||||
| @@ -37,24 +39,24 @@ public class SQLiteDbLoader implements IWaveformDbLoader { | ||||
| 	protected IDatabase database; | ||||
| 	 | ||||
| 	private List<RelationType> usedRelationsList = new ArrayList<>(); | ||||
|  | ||||
| 	private IWaveformDb db; | ||||
| 	 | ||||
| 	private ScvSimProps scvSimProps; | ||||
| 		 | ||||
| 	public SQLiteDbLoader() { | ||||
| 	} | ||||
| 	private static final byte[] x = "SQLite format 3".getBytes(); | ||||
|  | ||||
| 	/** The pcs. */ | ||||
| 	protected PropertyChangeSupport pcs = new PropertyChangeSupport(this); | ||||
|  | ||||
| 	@Override | ||||
| 	public Long getMaxTime() { | ||||
| 		SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<ScvTxEvent>(ScvTxEvent.class, | ||||
| 	public long getMaxTime() { | ||||
| 		SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<>(ScvTxEvent.class, | ||||
| 				database, "time = (SELECT MAX(time) FROM ScvTxEvent)"); | ||||
| 		try { | ||||
| 			List<ScvTxEvent> event = handler.selectObjects(); | ||||
| 			if(event.size()>0) | ||||
| 			if(!event.isEmpty()) | ||||
| 				return event.get(0).getTime()*scvSimProps.getTime_resolution(); | ||||
| 		} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | ||||
| 				| InvocationTargetException | SQLException | IntrospectionException e) { | ||||
| 				| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) { | ||||
| 			e.printStackTrace(); | ||||
| 		} | ||||
| 		return 0L; | ||||
| @@ -62,59 +64,84 @@ public class SQLiteDbLoader implements IWaveformDbLoader { | ||||
|  | ||||
| 	@Override | ||||
| 	public Collection<IWaveform> getAllWaves() { | ||||
| 		SQLiteDatabaseSelectHandler<ScvStream> handler = new SQLiteDatabaseSelectHandler<ScvStream>(ScvStream.class, database); | ||||
| 		List<IWaveform> streams=new ArrayList<IWaveform>(); | ||||
| 		SQLiteDatabaseSelectHandler<ScvStream> handler = new SQLiteDatabaseSelectHandler<>(ScvStream.class, database); | ||||
| 		List<IWaveform> streams=new ArrayList<>(); | ||||
| 		try { | ||||
| 			for(ScvStream scvStream:handler.selectObjects()){ | ||||
| 				TxStream stream = new TxStream(database, db, scvStream); | ||||
| 				TxStream stream = new TxStream(database, scvStream); | ||||
| 				stream.setRelationTypeList(usedRelationsList); | ||||
| 				streams.add(stream); | ||||
| 			} | ||||
| 		} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | ||||
| 				| InvocationTargetException | SQLException | IntrospectionException e) { | ||||
| //			e.printStackTrace(); | ||||
| 				| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) { | ||||
| 		} | ||||
| 		return streams; | ||||
| 	} | ||||
|  | ||||
| 	private byte[] x = "SQLite format 3".getBytes(); | ||||
| 	@Override | ||||
| 	public boolean canLoad(File inputFile) { | ||||
| 		if (!inputFile.isDirectory() && inputFile.exists()) { | ||||
| 			try(InputStream stream = new FileInputStream(inputFile)){ | ||||
| 				byte[] buffer = new byte[x.length]; | ||||
| 				int readCnt = stream.read(buffer, 0, x.length); | ||||
| 				if (readCnt == x.length) { | ||||
| 					for (int i = 0; i < x.length; i++) | ||||
| 						if (buffer[i] != x[i]) | ||||
| 							return false; | ||||
| 				} | ||||
| 				return true; | ||||
| 			} catch (Exception e) { | ||||
| 				return false; | ||||
| 			} | ||||
| 		} | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public boolean load(IWaveformDb db, File file) throws Exception { | ||||
| 		if(file.isDirectory() || !file.exists()) return false; | ||||
| 		this.db=db; | ||||
| 		try { | ||||
| 			FileInputStream fis = new FileInputStream(file); | ||||
| 			byte[] buffer = new byte[x.length]; | ||||
| 			int read = fis.read(buffer, 0, x.length); | ||||
| 			fis.close(); | ||||
| 			if (read == x.length) | ||||
| 				for (int i = 0; i < x.length; i++) | ||||
| 					if (buffer[i] != x[i])	return false; | ||||
| 		} catch(FileNotFoundException e) { | ||||
| 			return false; | ||||
| 		} catch(IOException e) { //if an I/O error occurs | ||||
| 			return false; | ||||
| 		} | ||||
| 		database=new SQLiteDatabase(file.getAbsolutePath()); | ||||
| 	public void load(IWaveformDb db, File file) throws InputFormatException { | ||||
| 		database=new SQLiteDatabase(file.getAbsolutePath(), db); | ||||
| 		database.setData("TIMERESOLUTION", 1L); | ||||
| 		SQLiteDatabaseSelectHandler<ScvSimProps> handler = new SQLiteDatabaseSelectHandler<ScvSimProps>(ScvSimProps.class, database); | ||||
| 		SQLiteDatabaseSelectHandler<ScvSimProps> handler = new SQLiteDatabaseSelectHandler<>(ScvSimProps.class, database); | ||||
| 		try { | ||||
| 			for(ScvSimProps simProps:handler.selectObjects()){ | ||||
| 				scvSimProps=simProps; | ||||
| 				database.setData("TIMERESOLUTION", scvSimProps.getTime_resolution()); | ||||
| 			} | ||||
| 			return true; | ||||
| 			pcs.firePropertyChange(IWaveformDbLoader.LOADING_FINISHED, null, null); | ||||
| 		} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | ||||
| 				| InvocationTargetException | SQLException | IntrospectionException e) { | ||||
| 			e.printStackTrace(); | ||||
| 				| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) { | ||||
| 			throw new InputFormatException(e.toString()); | ||||
| 		} | ||||
| 		return false; | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	public void dispose() { | ||||
| 		database=null; | ||||
| 		usedRelationsList=null; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Collection<RelationType> getAllRelationTypes(){ | ||||
| 		return usedRelationsList; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Adds the property change listener. | ||||
| 	 * | ||||
| 	 * @param l the l | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public void addPropertyChangeListener(PropertyChangeListener l) { | ||||
| 		pcs.addPropertyChangeListener(l); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Removes the property change listener. | ||||
| 	 * | ||||
| 	 * @param l the l | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public void removePropertyChangeListener(PropertyChangeListener l) { | ||||
| 		pcs.removePropertyChangeListener(l); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * Copyright (c) 2015-2021 MINRES Technologies GmbH 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 | ||||
| @@ -18,12 +18,7 @@ import java.util.Collection; | ||||
| import java.util.List; | ||||
|  | ||||
| import com.minres.scviewer.database.AssociationType; | ||||
| import com.minres.scviewer.database.ITx; | ||||
| import com.minres.scviewer.database.ITxAttribute; | ||||
| import com.minres.scviewer.database.ITxEvent; | ||||
| import com.minres.scviewer.database.ITxGenerator; | ||||
| import com.minres.scviewer.database.ITxRelation; | ||||
| import com.minres.scviewer.database.ITxStream; | ||||
| import com.minres.scviewer.database.IWaveform; | ||||
| import com.minres.scviewer.database.sqlite.db.IDatabase; | ||||
| import com.minres.scviewer.database.sqlite.db.SQLiteDatabaseSelectHandler; | ||||
| import com.minres.scviewer.database.sqlite.tables.ScvStream; | ||||
| @@ -31,6 +26,9 @@ import com.minres.scviewer.database.sqlite.tables.ScvTx; | ||||
| import com.minres.scviewer.database.sqlite.tables.ScvTxAttribute; | ||||
| import com.minres.scviewer.database.sqlite.tables.ScvTxEvent; | ||||
| import com.minres.scviewer.database.sqlite.tables.ScvTxRelation; | ||||
| import com.minres.scviewer.database.tx.ITx; | ||||
| import com.minres.scviewer.database.tx.ITxAttribute; | ||||
| import com.minres.scviewer.database.tx.ITxRelation; | ||||
|  | ||||
| public class Tx implements ITx { | ||||
|  | ||||
| @@ -39,8 +37,10 @@ public class Tx implements ITx { | ||||
| 	private TxGenerator trGenerator; | ||||
| 	private ScvTx scvTx; | ||||
| 	private List<ITxAttribute> attributes; | ||||
| 	private Long begin, end; | ||||
| 	private List<ITxRelation> incoming, outgoing; | ||||
| 	private long begin=-1; | ||||
| 	private long end=-1; | ||||
| 	private List<ITxRelation> incoming; | ||||
| 	private List<ITxRelation> outgoing; | ||||
| 	 | ||||
| 	public Tx(IDatabase database, TxStream trStream, TxGenerator trGenerator, ScvTx scvTx) { | ||||
| 		this.database=database; | ||||
| @@ -50,52 +50,51 @@ public class Tx implements ITx { | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Long getId() { | ||||
| 	public long getId() { | ||||
| 		return (long) scvTx.getId(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public ITxStream<ITxEvent> getStream() { | ||||
| 	public IWaveform getStream() { | ||||
| 		return trStream; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public ITxGenerator getGenerator() { | ||||
| 	public IWaveform getGenerator() { | ||||
| 		return trGenerator; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public int getConcurrencyIndex() { | ||||
| 	int getConcurrencyIndex() { | ||||
| 		return scvTx.getConcurrencyLevel(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Long getBeginTime() { | ||||
| 		if(begin==null){ | ||||
| 		SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<ScvTxEvent>(ScvTxEvent.class, | ||||
| 	public long getBeginTime() { | ||||
| 		if(begin<0){ | ||||
| 		SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<>(ScvTxEvent.class, | ||||
| 				database, "tx="+scvTx.getId()+" AND type="+ AssociationType.BEGIN.ordinal()); | ||||
| 		try { | ||||
| 			for(ScvTxEvent scvEvent:handler.selectObjects()){ | ||||
| 				begin= scvEvent.getTime()*(Long)database.getData("TIMERESOLUTION"); | ||||
| 			} | ||||
| 		} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | ||||
| 				| InvocationTargetException | SQLException | IntrospectionException e) { | ||||
| 				| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) { | ||||
| 		} | ||||
| 		} | ||||
| 		return begin; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Long getEndTime() { | ||||
| 		if(end==null){ | ||||
| 		SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<ScvTxEvent>(ScvTxEvent.class, | ||||
| 	public long getEndTime() { | ||||
| 		if(end<0){ | ||||
| 		SQLiteDatabaseSelectHandler<ScvTxEvent> handler = new SQLiteDatabaseSelectHandler<>(ScvTxEvent.class, | ||||
| 				database, "tx="+scvTx.getId()+" AND type="+ AssociationType.END.ordinal()); | ||||
| 		try { | ||||
| 			for(ScvTxEvent scvEvent:handler.selectObjects()){ | ||||
| 				end = scvEvent.getTime()*(Long)database.getData("TIMERESOLUTION"); | ||||
| 			} | ||||
| 		} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | ||||
| 				| InvocationTargetException | SQLException | IntrospectionException e) { | ||||
| 				| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) { | ||||
| 		} | ||||
| 		} | ||||
| 		return end; | ||||
| @@ -104,16 +103,16 @@ public class Tx implements ITx { | ||||
| 	@Override | ||||
| 	public List<ITxAttribute> getAttributes() { | ||||
| 		if(attributes==null){ | ||||
| 			SQLiteDatabaseSelectHandler<ScvTxAttribute> handler = new SQLiteDatabaseSelectHandler<ScvTxAttribute>( | ||||
| 			SQLiteDatabaseSelectHandler<ScvTxAttribute> handler = new SQLiteDatabaseSelectHandler<>( | ||||
| 					ScvTxAttribute.class, database, "tx="+scvTx.getId()); | ||||
| 			try { | ||||
| 				attributes = new ArrayList<ITxAttribute>(); | ||||
| 				attributes = new ArrayList<>(); | ||||
| 				for(ScvTxAttribute scvAttribute:handler.selectObjects()){ | ||||
| 					attributes.add(new TxAttribute(this, scvAttribute)); | ||||
| 					 | ||||
| 				} | ||||
| 			} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | ||||
| 					| InvocationTargetException | SQLException | IntrospectionException e) { | ||||
| 					| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) { | ||||
| 			} | ||||
| 		} | ||||
| 		return attributes; | ||||
| @@ -122,15 +121,15 @@ public class Tx implements ITx { | ||||
| 	@Override | ||||
| 	public Collection<ITxRelation> getIncomingRelations() { | ||||
| 		if(incoming==null){ | ||||
| 			SQLiteDatabaseSelectHandler<ScvTxRelation> handler = new SQLiteDatabaseSelectHandler<ScvTxRelation>( | ||||
| 			SQLiteDatabaseSelectHandler<ScvTxRelation> handler = new SQLiteDatabaseSelectHandler<>( | ||||
| 					ScvTxRelation.class, database, "sink="+scvTx.getId()); | ||||
| 			try { | ||||
| 				incoming = new ArrayList<ITxRelation>(); | ||||
| 				incoming = new ArrayList<>(); | ||||
| 				for(ScvTxRelation scvRelation:handler.selectObjects()){ | ||||
| 					incoming.add(createRelation(scvRelation, false)); | ||||
| 				} | ||||
| 			} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | ||||
| 					| InvocationTargetException | SQLException | IntrospectionException e) { | ||||
| 					| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) { | ||||
| 			} | ||||
| 		} | ||||
| 		return incoming; | ||||
| @@ -139,15 +138,15 @@ public class Tx implements ITx { | ||||
| 	@Override | ||||
| 	public Collection<ITxRelation> getOutgoingRelations() { | ||||
| 		if(outgoing==null){ | ||||
| 			SQLiteDatabaseSelectHandler<ScvTxRelation> handler = new SQLiteDatabaseSelectHandler<ScvTxRelation>( | ||||
| 			SQLiteDatabaseSelectHandler<ScvTxRelation> handler = new SQLiteDatabaseSelectHandler<>( | ||||
| 					ScvTxRelation.class, database, "src="+scvTx.getId()); | ||||
| 			try { | ||||
| 				outgoing = new ArrayList<ITxRelation>(); | ||||
| 				outgoing = new ArrayList<>(); | ||||
| 				for(ScvTxRelation scvRelation:handler.selectObjects()){ | ||||
| 					outgoing.add(createRelation(scvRelation, true)); | ||||
| 				} | ||||
| 			} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | ||||
| 					| InvocationTargetException | SQLException | IntrospectionException e) { | ||||
| 					| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) { | ||||
| 			} | ||||
| 		} | ||||
| 		return outgoing; | ||||
| @@ -155,7 +154,7 @@ public class Tx implements ITx { | ||||
|  | ||||
| 	private ITxRelation createRelation(ScvTxRelation rel, boolean outgoing) { | ||||
| 		int otherId = outgoing?rel.getSink():rel.getSrc(); | ||||
| 		SQLiteDatabaseSelectHandler<ScvTx> handler = new SQLiteDatabaseSelectHandler<ScvTx>(ScvTx.class, database, | ||||
| 		SQLiteDatabaseSelectHandler<ScvTx> handler = new SQLiteDatabaseSelectHandler<>(ScvTx.class, database, | ||||
| 				"id="+otherId); | ||||
| 		try { | ||||
| 			List<ScvTx> res = handler.selectObjects(); | ||||
| @@ -163,14 +162,14 @@ public class Tx implements ITx { | ||||
| 			List<ScvStream> streams = new SQLiteDatabaseSelectHandler<ScvStream>(ScvStream.class, database, | ||||
| 						"id="+res.get(0).getStream()).selectObjects(); | ||||
| 			if(streams.size()!=1) return null; | ||||
| 			TxStream tgtStream = (TxStream) trStream.getDb().getStreamByName(streams.get(0).getName()); | ||||
| 			TxStream tgtStream = (TxStream) database.getWaveformDb().getStreamByName(streams.get(0).getName()); | ||||
| 			Tx that = (Tx) tgtStream.getTransactions().get(otherId); | ||||
| 			if(outgoing) | ||||
| 				return new TxRelation(trStream.getRelationType(rel.getName()), this, that); | ||||
| 			else | ||||
| 				return new TxRelation(trStream.getRelationType(rel.getName()), that, this); | ||||
| 		} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | ||||
| 				| InvocationTargetException | SQLException | IntrospectionException e) { | ||||
| 				| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) { | ||||
| 			e.printStackTrace(); | ||||
| 		} | ||||
|  | ||||
| @@ -179,11 +178,11 @@ public class Tx implements ITx { | ||||
|  | ||||
| 	@Override | ||||
| 	public int compareTo(ITx o) { | ||||
| 		int res = this.getBeginTime().compareTo(o.getBeginTime()); | ||||
| 		int res = Long.compare(this.getBeginTime(), o.getBeginTime()); | ||||
| 		if(res!=0)	 | ||||
| 			return res; | ||||
| 		else | ||||
| 			return this.getId().compareTo(o.getId()); | ||||
| 			return Long.compare(this.getId(), o.getId()); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * Copyright (c) 2015-2021 MINRES Technologies GmbH 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 | ||||
| @@ -12,8 +12,8 @@ package com.minres.scviewer.database.sqlite; | ||||
|  | ||||
| import com.minres.scviewer.database.AssociationType; | ||||
| import com.minres.scviewer.database.DataType; | ||||
| import com.minres.scviewer.database.ITxAttribute; | ||||
| import com.minres.scviewer.database.sqlite.tables.ScvTxAttribute; | ||||
| import com.minres.scviewer.database.tx.ITxAttribute; | ||||
|  | ||||
| public class TxAttribute implements ITxAttribute{ | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * Copyright (c) 2015-2021 MINRES Technologies GmbH 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 | ||||
| @@ -10,43 +10,40 @@ | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.sqlite; | ||||
|  | ||||
| import com.minres.scviewer.database.ITx; | ||||
| import com.minres.scviewer.database.ITxEvent; | ||||
| import com.minres.scviewer.database.IWaveformEvent; | ||||
| import com.minres.scviewer.database.EventKind; | ||||
| import com.minres.scviewer.database.IEvent; | ||||
| import com.minres.scviewer.database.WaveformType; | ||||
| import com.minres.scviewer.database.tx.ITx; | ||||
| import com.minres.scviewer.database.tx.ITxEvent; | ||||
|  | ||||
| public class TxEvent implements ITxEvent { | ||||
|  | ||||
| 	private final Type type; | ||||
| 	private final EventKind type; | ||||
| 	private ITx tx; | ||||
| 	 | ||||
| 	public TxEvent(Type type, ITx tx) { | ||||
| 	public TxEvent(EventKind type, ITx tx) { | ||||
| 		super(); | ||||
| 		this.type = type; | ||||
| 		this.tx = tx; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Long getTime() { | ||||
| 		return type==Type.BEGIN?tx.getBeginTime():tx.getEndTime(); | ||||
| 	public long getTime() { | ||||
| 		return type==EventKind.BEGIN?tx.getBeginTime():tx.getEndTime(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public IWaveformEvent duplicate() throws CloneNotSupportedException { | ||||
| 	public IEvent duplicate() throws CloneNotSupportedException { | ||||
| 		return new TxEvent(type, tx); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public int compareTo(IWaveformEvent o) { | ||||
| 		return getTime().compareTo(o.getTime()); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public ITx getTransaction() { | ||||
| 		return tx; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Type getType() { | ||||
| 	public EventKind getKind() { | ||||
| 		return type; | ||||
| 	} | ||||
|  | ||||
| @@ -54,4 +51,15 @@ public class TxEvent implements ITxEvent { | ||||
| 	public String toString() { | ||||
| 		return type.toString()+"@"+getTime()+" of tx #"+tx.getId(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public WaveformType getType() { | ||||
| 		return WaveformType.TRANSACTION; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public int getRowIndex() { | ||||
| 		return ((Tx)tx).getConcurrencyIndex(); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * Copyright (c) 2015-2021 MINRES Technologies GmbH 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 | ||||
| @@ -10,43 +10,70 @@ | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.sqlite; | ||||
|  | ||||
| import java.util.List; | ||||
| import java.beans.IntrospectionException; | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.sql.SQLException; | ||||
| import java.util.Map; | ||||
| import java.util.TreeMap; | ||||
|  | ||||
| import com.minres.scviewer.database.ITx; | ||||
| import com.minres.scviewer.database.ITxEvent; | ||||
| import com.minres.scviewer.database.ITxGenerator; | ||||
| import com.minres.scviewer.database.ITxStream; | ||||
| import com.minres.scviewer.database.IWaveform; | ||||
| import com.minres.scviewer.database.sqlite.db.IDatabase; | ||||
| import com.minres.scviewer.database.sqlite.db.SQLiteDatabaseSelectHandler; | ||||
| import com.minres.scviewer.database.sqlite.tables.ScvGenerator; | ||||
| import com.minres.scviewer.database.sqlite.tables.ScvTx; | ||||
| import com.minres.scviewer.database.tx.ITx; | ||||
|  | ||||
| public class TxGenerator implements ITxGenerator { | ||||
| public class TxGenerator extends AbstractTxStream { | ||||
|  | ||||
| 	private ITxStream<ITxEvent>  stream; | ||||
| 	private TxStream  stream; | ||||
| 	 | ||||
| 	private ScvGenerator scvGenerator; | ||||
|  | ||||
| 	public TxGenerator(ITxStream<ITxEvent>  stream, ScvGenerator scvGenerator) { | ||||
| 	private TreeMap<Integer, ITx> transactions; | ||||
|  | ||||
| 	public TxGenerator(IDatabase database, TxStream stream, ScvGenerator scvGenerator) { | ||||
| 		super(database, scvGenerator.getName(), stream.getId()); | ||||
| 		this.stream=stream; | ||||
| 		this.scvGenerator=scvGenerator; | ||||
| 		stream.addChild(this); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Long getId() { | ||||
| 	public long getId() { | ||||
| 		return (long) scvGenerator.getId(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public ITxStream<ITxEvent> getStream() { | ||||
| 		return stream; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getName() { | ||||
| 		return scvGenerator.getName(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public List<ITx> getTransactions() { | ||||
| 		return null; | ||||
| 	public boolean isSame(IWaveform other) { | ||||
| 		return(other instanceof TxGenerator && this.getId() == other.getId()); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getKind() { | ||||
| 		return stream.getKind(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	protected Map<Integer, ITx> getTransactions() { | ||||
| 		if(transactions==null){ | ||||
| 			transactions = new TreeMap<>(); | ||||
| 			SQLiteDatabaseSelectHandler<ScvTx> handler = new SQLiteDatabaseSelectHandler<>(ScvTx.class, database, | ||||
| 					"stream="+stream.getId()+" and generator="+scvGenerator.getId()); | ||||
| 			try { | ||||
| 				for(ScvTx scvTx:handler.selectObjects()){ | ||||
| 					transactions.put(scvTx.getId(), new Tx(database, (TxStream) stream, this, scvTx)); | ||||
| 				} | ||||
| 			} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | ||||
| 					| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) { | ||||
| 				e.printStackTrace(); | ||||
| 			} | ||||
| 		} | ||||
| 		return transactions; | ||||
| 	} | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * Copyright (c) 2015-2021 MINRES Technologies GmbH 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 | ||||
| @@ -10,14 +10,15 @@ | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.sqlite; | ||||
|  | ||||
| import com.minres.scviewer.database.ITxRelation; | ||||
| import com.minres.scviewer.database.ITx; | ||||
| import com.minres.scviewer.database.RelationType; | ||||
| import com.minres.scviewer.database.tx.ITx; | ||||
| import com.minres.scviewer.database.tx.ITxRelation; | ||||
|  | ||||
| public class TxRelation implements ITxRelation { | ||||
|  | ||||
| 	RelationType relationType; | ||||
| 	Tx source, target; | ||||
| 	Tx source; | ||||
| 	Tx target; | ||||
|  | ||||
| 	public TxRelation(RelationType relationType, Tx source, Tx target) { | ||||
| 		this.source = source; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * Copyright (c) 2015-2021 MINRES Technologies GmbH 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 | ||||
| @@ -14,59 +14,33 @@ import java.beans.IntrospectionException; | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.sql.SQLException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Map.Entry; | ||||
| import java.util.NavigableMap; | ||||
| import java.util.TreeMap; | ||||
| import java.util.Vector; | ||||
|  | ||||
| import com.minres.scviewer.database.HierNode; | ||||
| import com.minres.scviewer.database.ITx; | ||||
| import com.minres.scviewer.database.ITxEvent; | ||||
| import com.minres.scviewer.database.ITxGenerator; | ||||
| import com.minres.scviewer.database.ITxStream; | ||||
| import com.minres.scviewer.database.IEvent; | ||||
| import com.minres.scviewer.database.IWaveform; | ||||
| import com.minres.scviewer.database.IWaveformDb; | ||||
| import com.minres.scviewer.database.RelationType; | ||||
| import com.minres.scviewer.database.sqlite.db.IDatabase; | ||||
| import com.minres.scviewer.database.sqlite.db.SQLiteDatabaseSelectHandler; | ||||
| import com.minres.scviewer.database.sqlite.tables.ScvGenerator; | ||||
| import com.minres.scviewer.database.sqlite.tables.ScvStream; | ||||
| import com.minres.scviewer.database.sqlite.tables.ScvTx; | ||||
| import com.minres.scviewer.database.tx.ITx; | ||||
|  | ||||
| public class TxStream extends HierNode implements ITxStream<ITxEvent> { | ||||
|  | ||||
| 	private IDatabase database; | ||||
| public class TxStream extends AbstractTxStream { | ||||
|  | ||||
| 	private String fullName; | ||||
| 	 | ||||
| 	private IWaveformDb db; | ||||
| 	 | ||||
| 	private ScvStream scvStream; | ||||
| 	 | ||||
| 	private TreeMap<Integer, TxGenerator> generators; | ||||
| 	 | ||||
| 	private TreeMap<Integer, ITx> transactions; | ||||
| 	 | ||||
| 	private Integer maxConcurrency; | ||||
| 	 | ||||
| 	private TreeMap<Long, List<ITxEvent>> events; | ||||
|  | ||||
| 	private List<RelationType> usedRelationsList; | ||||
| 	 | ||||
| 	public TxStream(IDatabase database, IWaveformDb waveformDb, ScvStream scvStream) { | ||||
| 		super(scvStream.getName()); | ||||
| 		this.database=database; | ||||
| 	private ScvStream scvStream; | ||||
|  | ||||
| 	private TreeMap<Integer, TxGenerator> generators; | ||||
|  | ||||
| 	private TreeMap<Integer, ITx> transactions; | ||||
|  | ||||
| 	public TxStream(IDatabase database, ScvStream scvStream) { | ||||
| 		super(database, scvStream.getName(), scvStream.getId()); | ||||
| 		fullName=scvStream.getName(); | ||||
| 		this.scvStream=scvStream; | ||||
| 		db=waveformDb; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public IWaveformDb getDb() { | ||||
| 		return db; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| @@ -75,101 +49,39 @@ public class TxStream extends HierNode implements ITxStream<ITxEvent> { | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Long getId() { | ||||
| 	public long getId() { | ||||
| 		return (long) scvStream.getId(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getKind() { | ||||
| 		return scvStream.getKind(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public List<ITxGenerator> getGenerators() { | ||||
| 	public List<IWaveform> getGenerators() { | ||||
| 		if(generators==null){ | ||||
| 			SQLiteDatabaseSelectHandler<ScvGenerator> handler = new SQLiteDatabaseSelectHandler<ScvGenerator>( | ||||
| 			SQLiteDatabaseSelectHandler<ScvGenerator> handler = new SQLiteDatabaseSelectHandler<>( | ||||
| 					ScvGenerator.class, database, "stream="+scvStream.getId()); | ||||
| 			generators=new TreeMap<Integer, TxGenerator>(); | ||||
| 			generators=new TreeMap<>(); | ||||
| 			try { | ||||
| 				for(ScvGenerator scvGenerator:handler.selectObjects()){ | ||||
| 					generators.put(scvGenerator.getId(), new TxGenerator(this, scvGenerator)); | ||||
| 					generators.put(scvGenerator.getId(), new TxGenerator(database, this, scvGenerator)); | ||||
| 				} | ||||
| 			} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | ||||
| 					| InvocationTargetException | SQLException | IntrospectionException e) { | ||||
| 					| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) { | ||||
| 				e.printStackTrace(); | ||||
| 			} | ||||
| 		} | ||||
| 		return new ArrayList<ITxGenerator>(generators.values()); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public int getMaxConcurrency() { | ||||
| 		if(maxConcurrency==null){ | ||||
| 			java.sql.Connection connection=null; | ||||
| 			java.sql.Statement statement=null; | ||||
| 			java.sql.ResultSet resultSet=null; | ||||
| 			try { | ||||
| 				connection = database.createConnection(); | ||||
| 				statement = connection.createStatement(); | ||||
| 				StringBuilder sb = new StringBuilder(); | ||||
| 				sb.append("SELECT MAX(concurrencyLevel) as concurrencyLevel FROM ScvTx where stream="); | ||||
| 				sb.append(scvStream.getId()); | ||||
| 				resultSet = statement.executeQuery(sb.toString()); | ||||
| 				while (resultSet.next()) { | ||||
| 					if(maxConcurrency==null) maxConcurrency=0; | ||||
| 					Object value = resultSet.getObject("concurrencyLevel"); | ||||
| 					if(value!=null) | ||||
| 						maxConcurrency=(Integer) value; | ||||
| 				} | ||||
| 			} catch (SQLException e) { | ||||
| 				if(maxConcurrency==null) maxConcurrency=0; | ||||
| 			} finally { | ||||
| 				try{ | ||||
| 				if(resultSet!=null) resultSet.close(); | ||||
| 				if(statement!=null) statement.close(); | ||||
| 				if(connection!=null) connection.close(); | ||||
| 				} catch (SQLException e) {	} | ||||
| 			} | ||||
| 			maxConcurrency+=1; | ||||
| 		} | ||||
| 		return maxConcurrency; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public  NavigableMap<Long, List<ITxEvent>> getEvents(){ | ||||
| 		if(events==null){ | ||||
| 			events=new TreeMap<Long, List<ITxEvent>>(); | ||||
| 			for(Entry<Integer, ITx> entry:getTransactions().entrySet()){ | ||||
| 				putEvent(new TxEvent(TxEvent.Type.BEGIN, entry.getValue())); | ||||
| 				putEvent(new TxEvent(TxEvent.Type.END, entry.getValue())); | ||||
| 			}	 | ||||
| 		} | ||||
| 		return events; | ||||
| 	} | ||||
|  | ||||
| 	private void putEvent(TxEvent ev){ | ||||
| 		Long time = ev.getTime(); | ||||
| 		if(!events.containsKey(time)){ | ||||
| 			Vector<ITxEvent> vector=new Vector<ITxEvent>(); | ||||
| 			vector.add(ev); | ||||
| 			events.put(time,  vector); | ||||
| 		} else { | ||||
| 			events.get(time).add(ev); | ||||
| 		} | ||||
| 		return new ArrayList<>(generators.values()); | ||||
| 	} | ||||
|  | ||||
| 	protected Map<Integer, ITx> getTransactions() { | ||||
| 		if(transactions==null){ | ||||
| 			if(generators==null) getGenerators(); | ||||
| 			transactions = new TreeMap<Integer, ITx>(); | ||||
| 			SQLiteDatabaseSelectHandler<ScvTx> handler = new SQLiteDatabaseSelectHandler<ScvTx>(ScvTx.class, database, | ||||
| 			transactions = new TreeMap<>(); | ||||
| 			SQLiteDatabaseSelectHandler<ScvTx> handler = new SQLiteDatabaseSelectHandler<>(ScvTx.class, database, | ||||
| 					"stream="+scvStream.getId()); | ||||
| 			try { | ||||
| 				for(ScvTx scvTx:handler.selectObjects()){ | ||||
| 					transactions.put(scvTx.getId(), new Tx(database, this, generators.get(scvTx.getGenerator()), scvTx)); | ||||
| 				} | ||||
| 			} catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException | ||||
| 					| InvocationTargetException | SQLException | IntrospectionException e) { | ||||
| 					| InvocationTargetException | SQLException | IntrospectionException | NoSuchMethodException e) { | ||||
| 				e.printStackTrace(); | ||||
| 			} | ||||
| 		} | ||||
| @@ -177,23 +89,17 @@ public class TxStream extends HierNode implements ITxStream<ITxEvent> { | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Collection<ITxEvent> getWaveformEventsAtTime(Long time) { | ||||
| 	public IEvent[] getEventsAtTime(long time) { | ||||
| 		return getEvents().get(time); | ||||
| 	} | ||||
|  | ||||
| 	public void setRelationTypeList(List<RelationType> usedRelationsList){ | ||||
| 		this.usedRelationsList=usedRelationsList; | ||||
| 	} | ||||
| 	 | ||||
| 	public RelationType getRelationType(String name) { | ||||
| 		RelationType relType=RelationType.create(name); | ||||
| 		if(!usedRelationsList.contains(relType)) usedRelationsList.add(relType); | ||||
| 		return relType; | ||||
| 	@Override | ||||
| 	public boolean isSame(IWaveform other) { | ||||
| 		return(other instanceof TxStream && this.getId() == other.getId()); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Boolean equals(IWaveform other) { | ||||
| 		return(other instanceof TxStream && this.getId().equals(other.getId())); | ||||
| 	public String getKind() { | ||||
| 		return scvStream.getKind(); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * Copyright (c) 2015-2021 MINRES Technologies GmbH 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 | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * Copyright (c) 2015-2021 MINRES Technologies GmbH 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 | ||||
| @@ -16,6 +16,8 @@ import java.sql.ResultSet; | ||||
| import java.sql.SQLException; | ||||
| import java.sql.Statement; | ||||
|  | ||||
| import com.minres.scviewer.database.IWaveformDb; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * Creates a connection to a database. | ||||
| @@ -58,4 +60,6 @@ public interface IDatabase { | ||||
| 	public void setData(String name, Object value); | ||||
| 	 | ||||
| 	public Object getData(String name);  | ||||
| 	 | ||||
| 	public IWaveformDb getWaveformDb(); | ||||
| }  | ||||
| @@ -1,5 +1,5 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * Copyright (c) 2015-2021 MINRES Technologies GmbH 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 | ||||
| @@ -20,10 +20,14 @@ import java.sql.SQLException; | ||||
| import java.sql.Statement; | ||||
| import java.util.HashMap; | ||||
|  | ||||
| import com.minres.scviewer.database.IWaveformDb; | ||||
|  | ||||
| public class SQLiteDatabase implements IDatabase { | ||||
|  | ||||
| 	protected String dbFileName; | ||||
| 	 | ||||
| 	protected IWaveformDb waveformDb; | ||||
| 	 | ||||
| 	protected HashMap<String, Object> props; | ||||
| 	 | ||||
|     static { | ||||
| @@ -39,9 +43,10 @@ public class SQLiteDatabase implements IDatabase { | ||||
| 		} | ||||
|     } | ||||
|      | ||||
| 	public SQLiteDatabase(String dbFileName) { | ||||
| 	public SQLiteDatabase(String dbFileName, IWaveformDb waveformDb) { | ||||
| 		super(); | ||||
| 		this.dbFileName = dbFileName; | ||||
| 		this.waveformDb = waveformDb; | ||||
| 		props = new HashMap<String, Object>(); | ||||
| 	} | ||||
|  | ||||
| @@ -89,4 +94,9 @@ public class SQLiteDatabase implements IDatabase { | ||||
| 		return props.get(name); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public IWaveformDb getWaveformDb() { | ||||
| 		return waveformDb; | ||||
| 	} | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * Copyright (c) 2015-2021 MINRES Technologies GmbH 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 | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * Copyright (c) 2015-2021 MINRES Technologies GmbH 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 | ||||
| @@ -75,11 +75,11 @@ public class SQLiteDatabaseSelectHandler<T> extends AbstractDatabaseHandler<T> { | ||||
| 	 * @throws IllegalAccessException | ||||
| 	 * @throws IntrospectionException | ||||
| 	 * @throws InvocationTargetException | ||||
| 	 * @throws NoSuchMethodException  | ||||
| 	 */ | ||||
| 	public synchronized List<T> selectObjects() throws SQLException, | ||||
| 			SecurityException, IllegalArgumentException, | ||||
| 			InstantiationException, IllegalAccessException, | ||||
| 			IntrospectionException, InvocationTargetException { | ||||
| 			IntrospectionException, InvocationTargetException, IllegalArgumentException, NoSuchMethodException, SecurityException { | ||||
|  | ||||
| 		Connection connection = null; | ||||
| 		Statement statement = null; | ||||
| @@ -114,18 +114,18 @@ public class SQLiteDatabaseSelectHandler<T> extends AbstractDatabaseHandler<T> { | ||||
| 	 * @throws IllegalAccessException | ||||
| 	 * @throws IntrospectionException | ||||
| 	 * @throws InvocationTargetException | ||||
| 	 * @throws NoSuchMethodException  | ||||
| 	 */ | ||||
| 	private List<T> createObjects(ResultSet resultSet) | ||||
| 			throws SecurityException, IllegalArgumentException, | ||||
| 			SQLException, InstantiationException, | ||||
| 			throws SQLException, InstantiationException, | ||||
| 			IllegalAccessException, IntrospectionException, | ||||
| 			InvocationTargetException { | ||||
| 			InvocationTargetException, IllegalArgumentException, NoSuchMethodException, SecurityException { | ||||
|  | ||||
| 		List<T> list = new ArrayList<T>(); | ||||
| 		List<T> list = new ArrayList<>(); | ||||
|  | ||||
| 		while (resultSet.next()) { | ||||
|  | ||||
| 			T instance = type.newInstance(); | ||||
| 			T instance = type.getDeclaredConstructor().newInstance(); | ||||
|  | ||||
| 			for (Field field : type.getDeclaredFields()) { | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * Copyright (c) 2015-2021 MINRES Technologies GmbH 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 | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * Copyright (c) 2015-2021 MINRES Technologies GmbH 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 | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * Copyright (c) 2015-2021 MINRES Technologies GmbH 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 | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * Copyright (c) 2015-2021 MINRES Technologies GmbH 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 | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * Copyright (c) 2015-2021 MINRES Technologies GmbH 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 | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * Copyright (c) 2015-2021 MINRES Technologies GmbH 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 | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2015 MINRES Technologies GmbH and others. | ||||
|  * Copyright (c) 2015-2021 MINRES Technologies GmbH 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 | ||||
|   | ||||
| @@ -1,20 +1,13 @@ | ||||
| <?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.8"> | ||||
| 		<attributes> | ||||
| 			<attribute name="maven.pomderived" value="true"/> | ||||
| 		</attributes> | ||||
| 	</classpathentry> | ||||
| 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/> | ||||
| 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> | ||||
| 	<classpathentry kind="src" path="src/"/> | ||||
| 	<classpathentry exported="true" kind="lib" path="lib/mapdb-3.0.7.jar" sourcepath="lib/mapdb-3.0.7-sources.jar"> | ||||
| 		<attributes> | ||||
| 			<attribute name="javadoc_location" value="jar:platform:/resource/com.minres.scviewer.database.text/lib/mapdb-3.0.7-javadoc.jar!/"/> | ||||
| 		</attributes> | ||||
| 	</classpathentry> | ||||
| 	<classpathentry kind="src" path="src/"/> | ||||
| 	<classpathentry exported="true" kind="lib" path="lib/eclipse-collections-9.2.0.jar"/> | ||||
| 	<classpathentry exported="true" kind="lib" path="lib/eclipse-collections-api-9.2.0.jar"/> | ||||
| 	<classpathentry exported="true" kind="lib" path="lib/eclipse-collections-forkjoin-9.2.0.jar"/> | ||||
| 	<classpathentry exported="true" kind="lib" path="lib/kotlin-stdlib-1.2.42.jar"/> | ||||
| 	<classpathentry exported="true" kind="lib" path="lib/lz4-1.3.0.jar"/> | ||||
| 	<classpathentry exported="true" kind="lib" path="lib/elsa-3.0.0-M5.jar"/> | ||||
|   | ||||
| @@ -33,7 +33,6 @@ | ||||
| 	</buildSpec> | ||||
| 	<natures> | ||||
| 		<nature>org.eclipse.m2e.core.maven2Nature</nature> | ||||
| 		<nature>org.eclipse.jdt.groovy.core.groovyNature</nature> | ||||
| 		<nature>org.eclipse.pde.PluginNature</nature> | ||||
| 		<nature>org.eclipse.jdt.core.javanature</nature> | ||||
| 	</natures> | ||||
|   | ||||
| @@ -1,9 +1,11 @@ | ||||
| eclipse.preferences.version=1 | ||||
| org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled | ||||
| org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 | ||||
| org.eclipse.jdt.core.compiler.compliance=1.8 | ||||
| org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 | ||||
| org.eclipse.jdt.core.compiler.compliance=11 | ||||
| org.eclipse.jdt.core.compiler.problem.assertIdentifier=error | ||||
| org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled | ||||
| org.eclipse.jdt.core.compiler.problem.enumIdentifier=error | ||||
| org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning | ||||
| org.eclipse.jdt.core.compiler.release=disabled | ||||
| org.eclipse.jdt.core.compiler.source=1.8 | ||||
| org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning | ||||
| org.eclipse.jdt.core.compiler.release=enabled | ||||
| org.eclipse.jdt.core.compiler.source=11 | ||||
|   | ||||
| @@ -2,22 +2,19 @@ Manifest-Version: 1.0 | ||||
| Bundle-ManifestVersion: 2 | ||||
| Bundle-Name: Textual transaction database | ||||
| Bundle-SymbolicName: com.minres.scviewer.database.text | ||||
| Bundle-Version: 2.0.2.qualifier | ||||
| Bundle-Version: 4.0.1.qualifier | ||||
| Bundle-Vendor: MINRES Technologies GmbH | ||||
| Bundle-RequiredExecutionEnvironment: JavaSE-1.8 | ||||
| Bundle-RequiredExecutionEnvironment: JavaSE-11 | ||||
| Import-Package: org.osgi.framework;version="1.3.0" | ||||
| Require-Bundle: com.minres.scviewer.database, | ||||
|  org.codehaus.groovy;bundle-version="2.5.8", | ||||
|  org.eclipse.osgi.services;bundle-version="3.4.0", | ||||
|  com.google.guava;bundle-version="15.0.0" | ||||
|  com.google.guava;bundle-version="15.0.0", | ||||
|  org.eclipse.collections;bundle-version="10.4.0" | ||||
| Service-Component: OSGI-INF/component.xml | ||||
| Bundle-ActivationPolicy: lazy | ||||
| Automatic-Module-Name: com.minres.scviewer.database.text | ||||
| Bundle-ClassPath: lib/mapdb-3.0.7.jar, | ||||
|  ., | ||||
|  lib/eclipse-collections-9.2.0.jar, | ||||
|  lib/eclipse-collections-api-9.2.0.jar, | ||||
|  lib/eclipse-collections-forkjoin-9.2.0.jar, | ||||
| Bundle-ClassPath: ., | ||||
|  lib/mapdb-3.0.7.jar, | ||||
|  lib/kotlin-stdlib-1.2.42.jar, | ||||
|  lib/lz4-1.3.0.jar, | ||||
|  lib/elsa-3.0.0-M5.jar | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="TextDbLoader"> | ||||
|    <implementation class="com.minres.scviewer.database.text.TextDbLoader"/> | ||||
| <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="TextDbLoaderFactory"> | ||||
|    <implementation class="com.minres.scviewer.database.text.TextDbLoaderFactory"/> | ||||
|    <service> | ||||
|       <provide interface="com.minres.scviewer.database.IWaveformDbLoader"/> | ||||
|       <provide interface="com.minres.scviewer.database.IWaveformDbLoaderFactory"/> | ||||
|    </service> | ||||
| </scr:component> | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| ############################################################################### | ||||
| # Copyright (c) 2014, 2015 MINRES Technologies GmbH and others. | ||||
| # Copyright (c) 2014, 2015-2021 MINRES Technologies GmbH 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 | ||||
| @@ -13,9 +13,6 @@ bin.includes = META-INF/,\ | ||||
|                OSGI-INF/,\ | ||||
|                lib/,\ | ||||
|                lib/mapdb-3.0.7.jar,\ | ||||
|                lib/eclipse-collections-9.2.0.jar,\ | ||||
|                lib/eclipse-collections-api-9.2.0.jar,\ | ||||
|                lib/eclipse-collections-forkjoin-9.2.0.jar,\ | ||||
|                lib/kotlin-stdlib-1.2.42.jar,\ | ||||
|                lib/lz4-1.3.0.jar,\ | ||||
|                lib/elsa-3.0.0-M5.jar | ||||
|   | ||||
							
								
								
									
										177
									
								
								plugins/com.minres.scviewer.database.text/lib/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								plugins/com.minres.scviewer.database.text/lib/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,177 @@ | ||||
|  | ||||
|                                  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 | ||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -2,44 +2,13 @@ | ||||
| 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
| 	<modelVersion>4.0.0</modelVersion> | ||||
| 	<artifactId>com.minres.scviewer.database.text</artifactId> | ||||
| 	<version>2.0.2-SNAPSHOT</version> | ||||
| 	<version>4.0.1-SNAPSHOT</version> | ||||
| 	<parent> | ||||
| 		<groupId>com.minres.scviewer</groupId> | ||||
| 		<artifactId>com.minres.scviewer.parent</artifactId> | ||||
| 		<version>2.0.0-SNAPSHOT</version> | ||||
| 		<version>2.15.1</version> | ||||
| 		<relativePath>../..</relativePath> | ||||
| 	</parent> | ||||
| 	<packaging>eclipse-plugin</packaging> | ||||
| 	 | ||||
| 	<build> | ||||
| 		<plugins> | ||||
| 			<plugin> | ||||
| 				<groupId>org.eclipse.tycho</groupId> | ||||
| 				<artifactId>maven-compiler-plugin</artifactId> | ||||
| 				<version>3.8.0</version> | ||||
| 				<configuration> | ||||
| 					<compilerId>groovy-eclipse-compiler</compilerId> | ||||
| 			        <compilerArguments> | ||||
| 			            <indy/><!-- optional; supported by batch 2.4.12-04+ --> | ||||
| 			        </compilerArguments> | ||||
| 					<!-- set verbose to be true if you want lots of uninteresting messages --> | ||||
| 					<!-- <verbose>true</verbose> --> | ||||
| 					<source>1.8</source> | ||||
| 					<target>1.8</target> | ||||
| 				</configuration> | ||||
| 				<dependencies> | ||||
| 					<dependency> | ||||
| 						<groupId>org.codehaus.groovy</groupId> | ||||
| 						<artifactId>groovy-eclipse-compiler</artifactId> | ||||
| 						<version>${groovy-eclipse-compiler-version}</version> | ||||
| 					</dependency> | ||||
| 					<dependency> | ||||
| 						<groupId>org.codehaus.groovy</groupId> | ||||
| 						<artifactId>groovy-eclipse-batch</artifactId> | ||||
| 						<version>${groovy-eclipse-batch-version}</version> | ||||
| 					</dependency> | ||||
| 				</dependencies> | ||||
| 			</plugin> | ||||
| 		</plugins> | ||||
| 	</build> | ||||
| </project> | ||||
|   | ||||
| @@ -0,0 +1,189 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2012 IT Just working | ||||
|  * Copyright (c) 2020 MINRES Technologies GmbH | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     IT Just working - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.HashMap; | ||||
|  | ||||
| import com.minres.scviewer.database.EventEntry; | ||||
| import com.minres.scviewer.database.EventList; | ||||
| import com.minres.scviewer.database.HierNode; | ||||
| import com.minres.scviewer.database.IEvent; | ||||
| import com.minres.scviewer.database.IEventList; | ||||
| import com.minres.scviewer.database.IWaveform; | ||||
| import com.minres.scviewer.database.WaveformType; | ||||
| import com.minres.scviewer.database.tx.ITx; | ||||
| import com.minres.scviewer.database.tx.ITxEvent; | ||||
|  | ||||
| /** | ||||
|  * The Class AbstractTxStream. | ||||
|  */ | ||||
| abstract class AbstractTxStream extends HierNode implements IWaveform { | ||||
|  | ||||
| 	private final String fullName; | ||||
|  | ||||
| 	/** The id. */ | ||||
| 	private Long id; | ||||
|  | ||||
| 	/** The loader. */ | ||||
| 	protected TextDbLoader loader; | ||||
|  | ||||
| 	/** The events. */ | ||||
| 	IEventList events = new EventList(); | ||||
|  | ||||
| 	/** The max concurrency. */ | ||||
| 	private int rowCount = -1; | ||||
|  | ||||
| 	/** | ||||
| 	 * Instantiates a new abstract tx stream. | ||||
| 	 * | ||||
| 	 * @param loader the loader | ||||
| 	 * @param id     the id | ||||
| 	 * @param name   the name | ||||
| 	 */ | ||||
| 	protected AbstractTxStream(TextDbLoader loader, Long id, String name) { | ||||
| 		super(name); | ||||
| 		fullName=name; | ||||
| 		this.loader = loader; | ||||
| 		this.id = id; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the full hierarchical name. | ||||
| 	 * | ||||
| 	 * @return the full name | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public String getFullName() { | ||||
| 		return  fullName; | ||||
| 	} | ||||
| 	/** | ||||
| 	 * Adds the event. | ||||
| 	 * | ||||
| 	 * @param evt the evt | ||||
| 	 */ | ||||
| 	public void addEvent(ITxEvent evt) { | ||||
| 		events.put(evt.getTime(), evt); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the events. | ||||
| 	 * | ||||
| 	 * @return the events | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public IEventList getEvents() { | ||||
| 		return events; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the events at time. | ||||
| 	 * | ||||
| 	 * @param time the time | ||||
| 	 * @return the events at time | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public IEvent[] getEventsAtTime(long time) { | ||||
| 		return events.get(time); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the events before time. | ||||
| 	 * | ||||
| 	 * @param time the time | ||||
| 	 * @return the events before time | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public IEvent[] getEventsBeforeTime(long time) { | ||||
| 		EventEntry e = events.floorEntry(time); | ||||
| 		if (e == null) | ||||
| 			return new IEvent[] {}; | ||||
| 		else | ||||
| 			return events.floorEntry(time).events; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the type. | ||||
| 	 * | ||||
| 	 * @return the type | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public WaveformType getType() { | ||||
| 		return WaveformType.TRANSACTION; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the id. | ||||
| 	 * | ||||
| 	 * @return the id | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public long getId() { | ||||
| 		return id; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the width. | ||||
| 	 * | ||||
| 	 * @return the width | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public int getRowCount() { | ||||
| 		if (rowCount<0) | ||||
| 			calculateConcurrency(); | ||||
| 		return rowCount; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Calculate concurrency. | ||||
| 	 */ | ||||
| 	void calculateConcurrency() { | ||||
| 		if (rowCount>=0) | ||||
| 			return; | ||||
| 		ArrayList<Long> rowEndTime = new ArrayList<>(); | ||||
| 		HashMap<Long, Integer> rowByTxId = new HashMap<>(); | ||||
| 		for(EventEntry entry: events) { | ||||
| 			for(IEvent evt:entry.events) { | ||||
| 				TxEvent txEvt = (TxEvent) evt; | ||||
| 				ITx tx = txEvt.getTransaction(); | ||||
| 				int rowIdx = 0; | ||||
| 				switch(evt.getKind()) { | ||||
| 				case END: | ||||
| 					Long txId = txEvt.getTransaction().getId(); | ||||
| 					txEvt.setConcurrencyIndex(rowByTxId.get(txId)); | ||||
| 					rowByTxId.remove(txId); | ||||
| 					break; | ||||
| 				case SINGLE: | ||||
| 					for (; rowIdx < rowEndTime.size() && rowEndTime.get(rowIdx)>tx.getBeginTime(); rowIdx++); | ||||
| 					if (rowEndTime.size() <= rowIdx) | ||||
| 						rowEndTime.add(tx.getEndTime()); | ||||
| 					else | ||||
| 						rowEndTime.set(rowIdx, tx.getEndTime()); | ||||
| 					((TxEvent) evt).setConcurrencyIndex(rowIdx); | ||||
| 					break; | ||||
| 				case BEGIN: | ||||
| 					for (; rowIdx < rowEndTime.size() && rowEndTime.get(rowIdx)>tx.getBeginTime(); rowIdx++); | ||||
| 					if (rowEndTime.size() <= rowIdx) | ||||
| 						rowEndTime.add(tx.getEndTime()); | ||||
| 					else | ||||
| 						rowEndTime.set(rowIdx, tx.getEndTime()); | ||||
| 					((TxEvent) evt).setConcurrencyIndex(rowIdx); | ||||
| 					rowByTxId.put(tx.getId(), rowIdx); | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		rowCount=rowEndTime.size()>0?rowEndTime.size():1; | ||||
| 		getChildNodes().parallelStream().forEach(c -> ((TxGenerator)c).calculateConcurrency()); | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,47 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2020 MINRES Technologies GmbH 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: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text; | ||||
|  | ||||
| import java.io.Serializable; | ||||
|  | ||||
| import com.minres.scviewer.database.RelationType; | ||||
|  | ||||
| /** | ||||
|  * The Class ScvRelation. | ||||
|  */ | ||||
| class ScvRelation implements Serializable { | ||||
|  | ||||
| 	/** The Constant serialVersionUID. */ | ||||
| 	private static final long serialVersionUID = -347668857680574140L; | ||||
|  | ||||
| 	/** The source. */ | ||||
| 	final long source; | ||||
|  | ||||
| 	/** The target. */ | ||||
| 	final long target; | ||||
|  | ||||
| 	/** The relation type. */ | ||||
| 	final RelationType relationType; | ||||
|  | ||||
| 	/** | ||||
| 	 * Instantiates a new scv relation. | ||||
| 	 * | ||||
| 	 * @param relationType the relation type | ||||
| 	 * @param source       the source | ||||
| 	 * @param target       the target | ||||
| 	 */ | ||||
| 	public ScvRelation(RelationType relationType, long source, long target) { | ||||
| 		this.source = source; | ||||
| 		this.target = target; | ||||
| 		this.relationType = relationType; | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,70 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2012 IT Just working. | ||||
|  * Copyright (c) 2020 MINRES Technologies GmbH | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     IT Just working - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text; | ||||
|  | ||||
| import java.io.Serializable; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
|  | ||||
| import com.minres.scviewer.database.tx.ITxAttribute; | ||||
|  | ||||
| /** | ||||
|  * The Class ScvTx. | ||||
|  */ | ||||
| class ScvTx implements Serializable { | ||||
|  | ||||
| 	/** The Constant serialVersionUID. */ | ||||
| 	private static final long serialVersionUID = -855200240003328221L; | ||||
|  | ||||
| 	/** The id. */ | ||||
| 	final long id; | ||||
|  | ||||
| 	/** The generator id. */ | ||||
| 	final long generatorId; | ||||
|  | ||||
| 	/** The stream id. */ | ||||
| 	final long streamId; | ||||
|  | ||||
| 	/** The begin time. */ | ||||
| 	long beginTime; | ||||
|  | ||||
| 	/** The end time. */ | ||||
| 	long endTime; | ||||
|  | ||||
| 	/** The attributes. */ | ||||
| 	final List<ITxAttribute> attributes = new ArrayList<>(); | ||||
|  | ||||
| 	/** | ||||
| 	 * Instantiates a new scv tx. | ||||
| 	 * | ||||
| 	 * @param id          the id | ||||
| 	 * @param streamId    the stream id | ||||
| 	 * @param generatorId the generator id | ||||
| 	 * @param begin       the begin | ||||
| 	 */ | ||||
| 	ScvTx(long id, long streamId, long generatorId, long begin) { | ||||
| 		this.id = id; | ||||
| 		this.streamId = streamId; | ||||
| 		this.generatorId = generatorId; | ||||
| 		this.beginTime = begin; | ||||
| 		this.endTime = begin; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the id. | ||||
| 	 * | ||||
| 	 * @return the id | ||||
| 	 */ | ||||
| 	Long getId() { | ||||
| 		return id; | ||||
| 	} | ||||
| } | ||||
| @@ -1,242 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2012 IT Just working. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     IT Just working - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text; | ||||
|  | ||||
| import java.nio.charset.CharsetDecoder; | ||||
| import java.util.Collection; | ||||
| import java.util.zip.GZIPInputStream | ||||
|  | ||||
| import org.codehaus.groovy.ast.stmt.CatchStatement | ||||
| import org.mapdb.DB | ||||
| import org.mapdb.DBMaker | ||||
|  | ||||
| import groovy.io.FileType | ||||
|  | ||||
| import com.minres.scviewer.database.AssociationType | ||||
| import com.minres.scviewer.database.DataType | ||||
| import com.minres.scviewer.database.ITxGenerator | ||||
| import com.minres.scviewer.database.ITxStream | ||||
| import com.minres.scviewer.database.IWaveform | ||||
| import com.minres.scviewer.database.IWaveformDb | ||||
| import com.minres.scviewer.database.IWaveformDbLoader | ||||
| import com.minres.scviewer.database.RelationType | ||||
|  | ||||
| public class TextDbLoader implements IWaveformDbLoader{ | ||||
|  | ||||
| 	private Long maxTime; | ||||
|  | ||||
| 	IWaveformDb db; | ||||
|  | ||||
| 	def streams = [] | ||||
|  | ||||
| 	def relationTypes=[:] | ||||
|  | ||||
| 	DB mapDb | ||||
| 	 | ||||
| 	public TextDbLoader() { | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Long getMaxTime() { | ||||
| 		return maxTime; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Collection<IWaveform> getAllWaves() { | ||||
| 		return streams; | ||||
| 	} | ||||
|  | ||||
| 	public Map<Long, ITxGenerator> getGeneratorsById() { | ||||
| 		TreeMap<Long, ITxGenerator> res = new TreeMap<Long, ITxGenerator>(); | ||||
| 		streams.each{TxStream stream -> stream.generators.each{res.put(it.id, id)} } | ||||
| 		return res; | ||||
| 	} | ||||
|  | ||||
| 	static final byte[] x = "scv_tr_stream".bytes | ||||
|  | ||||
| 	@Override | ||||
| 	boolean load(IWaveformDb db, File file) throws Exception { | ||||
| 		if(file.isDirectory() || !file.exists()) return false; | ||||
| 		this.db=db | ||||
| 		this.streams=[] | ||||
| 		try { | ||||
| 			def gzipped = isGzipped(file) | ||||
| 			if(isTxfile(gzipped?new GZIPInputStream(new FileInputStream(file)):new FileInputStream(file))){ | ||||
| 				def mapDbFile = File.createTempFile("."+file.name, null /*"tmp"*/, null /*file.parentFile*/) | ||||
| 				mapDbFile.delete() | ||||
| 				mapDbFile.deleteOnExit() | ||||
| 				this.mapDb = DBMaker | ||||
| 				.fileDB(mapDbFile) | ||||
| 				.fileMmapEnableIfSupported() | ||||
| 				.fileMmapPreclearDisable() | ||||
| 				.cleanerHackEnable() | ||||
| 				.allocateStartSize(64*1024*1024) | ||||
| 				.allocateIncrement(64*1024*1024) | ||||
| 				.make() | ||||
| 				// NPE here ---> | ||||
| 				parseInput(gzipped?new GZIPInputStream(new FileInputStream(file)):new FileInputStream(file)) | ||||
| 				streams.each{ TxStream  stream -> stream.getMaxConcurrency() } | ||||
| 				return true | ||||
| 			} | ||||
| 		} catch (IndexOutOfBoundsException e) { | ||||
| 			return false | ||||
| 		} catch (IllegalArgumentException e) { | ||||
| 			return false | ||||
| 		} catch (NumberFormatException e) { | ||||
| 			return false | ||||
| 		} catch(EOFException e) { | ||||
| 			return true; | ||||
| 		} catch(Exception e) { | ||||
| 			System.out.println("---->>> Exception "+e.toString()+" caught while loading database"); | ||||
| 			//System.out.println("---->>> Exception "+e.toString()+" caught while loading database. StackTrace following... "); | ||||
| 			//e.printStackTrace() | ||||
| 		} | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	private static boolean isTxfile(InputStream istream) { | ||||
| 		byte[] buffer = new byte[x.size()] | ||||
| 		def readCnt = istream.read(buffer, 0, x.size()) | ||||
| 		istream.close() | ||||
| 		if(readCnt==x.size()){ | ||||
| 			for(int i=0; i<x.size(); i++) | ||||
| 				if(buffer[i]!=x[i]) return false | ||||
| 		} | ||||
| 		return true | ||||
| 	} | ||||
|  | ||||
| 	private static boolean isGzipped(File f) { | ||||
| 		InputStream is = null; | ||||
| 		try { | ||||
| 			is = new FileInputStream(f); | ||||
| 			byte [] signature = new byte[2]; | ||||
| 			int nread = is.read( signature ); //read the gzip signature | ||||
| 			return nread == 2 && signature[ 0 ] == (byte) 0x1f && signature[ 1 ] == (byte) 0x8b; | ||||
| 		} catch (IOException e) { | ||||
| 			return false; | ||||
| 		} finally { | ||||
| 			if(is!=null) is.close() | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	private stringToScale(String scale){ | ||||
| 		switch(scale.trim()){ | ||||
| 			case "fs":return 1L | ||||
| 			case "ps":return 1000L | ||||
| 			case "ns":return 1000000L | ||||
| 			case "us":return 1000000000L | ||||
| 			case "ms":return 1000000000000L | ||||
| 			case "s": return 1000000000000000L | ||||
| 		} | ||||
| 		return 1L | ||||
| 	} | ||||
| 	 | ||||
| 	private def parseInput(InputStream inputStream){ | ||||
| 		def streamsById = [:] | ||||
| 		def generatorsById = [:] | ||||
| 		def transactionsById = [:] | ||||
| 		TxGenerator generator | ||||
| 		Tx transaction | ||||
| 		boolean endTransaction=false | ||||
| 		def matcher | ||||
| 		BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); | ||||
| 		long lineCnt=0; | ||||
| 		reader.eachLine { line -> | ||||
| 			def tokens = line.split(/\s+/) as ArrayList | ||||
| 			switch(tokens[0]){ | ||||
| 				case "scv_tr_stream": | ||||
| 					if ((matcher = line =~ /^scv_tr_stream\s+\(ID (\d+),\s+name\s+"([^"]+)",\s+kind\s+"([^"]+)"\)$/)) { | ||||
| 						def id = Integer.parseInt(matcher[0][1]) | ||||
| 						def stream = new TxStream(this, id, matcher[0][2], matcher[0][3]) | ||||
| 						streams<<stream | ||||
| 						streamsById[id]=stream | ||||
| 					} | ||||
| 					break; | ||||
| 				case "scv_tr_generator": | ||||
| 					if ((matcher = line =~ /^scv_tr_generator\s+\(ID\s+(\d+),\s+name\s+"([^"]+)",\s+scv_tr_stream\s+(\d+),$/)) { | ||||
| 						def id = Integer.parseInt(matcher[0][1]) | ||||
| 						ITxStream stream=streamsById[Integer.parseInt(matcher[0][3])] | ||||
| 						generator=new TxGenerator(id, stream, matcher[0][2]) | ||||
| 						stream.generators<<generator | ||||
| 						generatorsById[id]=generator | ||||
| 					} | ||||
| 					break; | ||||
| 				case "begin_attribute": | ||||
| 					if ((matcher = line =~ /^begin_attribute \(ID (\d+), name "([^"]+)", type "([^"]+)"\)$/)) { | ||||
| 						generator.begin_attrs << TxAttributeType.getAttrType(matcher[0][2], DataType.valueOf(matcher[0][3]), AssociationType.BEGIN) | ||||
| 					} | ||||
| 					break; | ||||
| 				case "end_attribute": | ||||
| 					if ((matcher = line =~ /^end_attribute \(ID (\d+), name "([^"]+)", type "([^"]+)"\)$/)) { | ||||
| 						generator.end_attrs << TxAttributeType.getAttrType(matcher[0][2], DataType.valueOf(matcher[0][3]), AssociationType.END) | ||||
| 					} | ||||
| 					break; | ||||
| 				case ")": | ||||
| 					generator=null | ||||
| 					break | ||||
| 				case "tx_begin"://matcher = line =~ /^tx_begin\s+(\d+)\s+(\d+)\s+(\d+)\s+([munpf]?s)/ | ||||
| 					def id = Integer.parseInt(tokens[1]) | ||||
| 					TxGenerator gen=generatorsById[Integer.parseInt(tokens[2])] | ||||
| 					transaction = new Tx(id, gen.stream, gen, Long.parseLong(tokens[3])*stringToScale(tokens[4])) | ||||
| 					gen.transactions << transaction | ||||
| 					transactionsById[id]= transaction | ||||
| 					gen.begin_attrs_idx=0; | ||||
| 					maxTime = maxTime>transaction.beginTime?maxTime:transaction.beginTime | ||||
| 					endTransaction=false | ||||
| 					break | ||||
| 				case "tx_end"://matcher = line =~ /^tx_end\s+(\d+)\s+(\d+)\s+(\d+)\s+([munpf]?s)/ | ||||
| 					def id = Integer.parseInt(tokens[1]) | ||||
| 					transaction = transactionsById[id] | ||||
| 					assert Integer.parseInt(tokens[2])==transaction.generator.id | ||||
| 					transaction.endTime = Long.parseLong(tokens[3])*stringToScale(tokens[4]) | ||||
| 					transaction.generator.end_attrs_idx=0; | ||||
| 					maxTime = maxTime>transaction.endTime?maxTime:transaction.endTime | ||||
| 					endTransaction=true | ||||
| 					break | ||||
| 				case "tx_record_attribute"://matcher = line =~ /^tx_record_attribute\s+(\d+)\s+"([^"]+)"\s+(\S+)\s*=\s*(.+)$/ | ||||
| 					def id = Integer.parseInt(tokens[1]) | ||||
| 					def name = tokens[2][1..-2] | ||||
| 					def type = tokens[3] as DataType | ||||
| 					def remaining = tokens.size()>5?tokens[5..-1].join(' '):"" | ||||
| 					transactionsById[id].attributes<<new TxAttribute(name, type, AssociationType.RECORD, remaining) | ||||
| 					break | ||||
| 				case "a"://matcher = line =~ /^a\s+(.+)$/ | ||||
| 					if(endTransaction){ | ||||
| 						transaction.attributes << new TxAttribute(transaction.generator.end_attrs[transaction.generator.end_attrs_idx], tokens[1]) | ||||
| 						transaction.generator.end_attrs_idx++ | ||||
| 					} else { | ||||
| 						transaction.attributes << new TxAttribute(transaction.generator.begin_attrs[transaction.generator.begin_attrs_idx], tokens[1]) | ||||
| 						transaction.generator.begin_attrs_idx++ | ||||
| 					} | ||||
| 					break | ||||
| 				case "tx_relation"://matcher = line =~ /^tx_relation\s+\"(\S+)\"\s+(\d+)\s+(\d+)$/ | ||||
| 					Tx tr2= transactionsById[Integer.parseInt(tokens[2])] | ||||
| 					Tx tr1= transactionsById[Integer.parseInt(tokens[3])] | ||||
| 					def relType=tokens[1][1..-2] | ||||
| 					if(!relationTypes.containsKey(relType)) relationTypes[relType]=RelationType.create(relType) | ||||
| 					def rel = new TxRelation(relationTypes[relType], tr1, tr2) | ||||
| 					tr1.outgoingRelations<<rel | ||||
| 					tr2.incomingRelations<<rel | ||||
| 					break | ||||
| 				default: | ||||
| 					println "Don't know what to do with: '$line'" | ||||
|  | ||||
| 			} | ||||
| 			lineCnt++ | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	public Collection<RelationType> getAllRelationTypes(){ | ||||
| 		return relationTypes.values(); | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| @@ -0,0 +1,551 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2012 IT Just working. | ||||
|  * Copyright (c) 2020 MINRES Technologies GmbH | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     IT Just working - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text; | ||||
|  | ||||
| import java.beans.PropertyChangeListener; | ||||
| import java.beans.PropertyChangeSupport; | ||||
| import java.io.BufferedReader; | ||||
| import java.io.File; | ||||
| import java.io.FileInputStream; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.io.InputStreamReader; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.nio.file.Files; | ||||
| import java.nio.file.Paths; | ||||
| 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.Map.Entry; | ||||
| import java.util.regex.Matcher; | ||||
| import java.util.regex.Pattern; | ||||
| import java.util.zip.GZIPInputStream; | ||||
|  | ||||
| import org.eclipse.collections.impl.map.mutable.UnifiedMap; | ||||
| import org.mapdb.DB; | ||||
| import org.mapdb.DBMaker; | ||||
| import org.mapdb.HTreeMap; | ||||
| import org.mapdb.Serializer; | ||||
|  | ||||
| import com.google.common.collect.HashMultimap; | ||||
| import com.minres.scviewer.database.AssociationType; | ||||
| import com.minres.scviewer.database.DataType; | ||||
| import com.minres.scviewer.database.EventKind; | ||||
| import com.minres.scviewer.database.IWaveform; | ||||
| import com.minres.scviewer.database.IWaveformDb; | ||||
| import com.minres.scviewer.database.IWaveformDbLoader; | ||||
| import com.minres.scviewer.database.InputFormatException; | ||||
| import com.minres.scviewer.database.RelationType; | ||||
| import com.minres.scviewer.database.RelationTypeFactory; | ||||
| import com.minres.scviewer.database.tx.ITx; | ||||
|  | ||||
| /** | ||||
|  * The Class TextDbLoader. | ||||
|  */ | ||||
| public class TextDbLoader implements IWaveformDbLoader { | ||||
|  | ||||
| 	/** the file size limit of a zipped txlog where the loader starts to use a file mapped database */ | ||||
| 	private static final long MEMMAP_LIMIT=256l*1024l*1024l; | ||||
| 	 | ||||
| 	private static final long MAPDB_INITIAL_ALLOC = 512l*1024l*1024l; | ||||
| 	 | ||||
| 	private static final long MAPDB_INCREMENTAL_ALLOC = 128l*1024l*1024l; | ||||
| 	 | ||||
| 	/** The max time. */ | ||||
| 	private Long maxTime = 0L; | ||||
|  | ||||
| 	/** The map db. */ | ||||
| 	DB mapDb = null; | ||||
|  | ||||
| 	/** The attr values. */ | ||||
| 	final List<String> attrValues = new ArrayList<>(); | ||||
|  | ||||
| 	/** The relation types. */ | ||||
| 	final Map<String, RelationType> relationTypes = UnifiedMap.newMap(); | ||||
|  | ||||
| 	/** The tx streams. */ | ||||
| 	final Map<Long, TxStream> txStreams = UnifiedMap.newMap(); | ||||
|  | ||||
| 	/** The tx generators. */ | ||||
| 	final Map<Long, TxGenerator> txGenerators = UnifiedMap.newMap(); | ||||
|  | ||||
| 	/** The transactions. */ | ||||
| 	Map<Long, ScvTx> transactions = null; | ||||
|  | ||||
| 	/** The attribute types. */ | ||||
| 	final Map<String, TxAttributeType> attributeTypes = UnifiedMap.newMap(); | ||||
|  | ||||
| 	/** The relations in. */ | ||||
| 	final HashMultimap<Long, ScvRelation> relationsIn = HashMultimap.create(); | ||||
|  | ||||
| 	/** The relations out. */ | ||||
| 	final HashMultimap<Long, ScvRelation> relationsOut = HashMultimap.create(); | ||||
|  | ||||
| 	/** The tx cache. */ | ||||
| 	HashMap<Long, Tx> txCache = new HashMap<>(); | ||||
|  | ||||
| 	/** The threads. */ | ||||
| 	List<Thread> threads = new ArrayList<>(); | ||||
|  | ||||
| 	/** The pcs. */ | ||||
| 	protected PropertyChangeSupport pcs = new PropertyChangeSupport(this); | ||||
|  | ||||
| 	/** The Constant x. */ | ||||
| 	static final byte[] x = "scv_tr_stream".getBytes(); | ||||
|  | ||||
| 	/** | ||||
| 	 * Adds the property change listener. | ||||
| 	 * | ||||
| 	 * @param l the l | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public void addPropertyChangeListener(PropertyChangeListener l) { | ||||
| 		pcs.addPropertyChangeListener(l); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Removes the property change listener. | ||||
| 	 * | ||||
| 	 * @param l the l | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public void removePropertyChangeListener(PropertyChangeListener l) { | ||||
| 		pcs.removePropertyChangeListener(l); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the max time. | ||||
| 	 * | ||||
| 	 * @return the max time | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public long getMaxTime() { | ||||
| 		return maxTime; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the transaction. | ||||
| 	 * | ||||
| 	 * @param txId the tx id | ||||
| 	 * @return the transaction | ||||
| 	 */ | ||||
| 	public ITx getTransaction(long txId) { | ||||
| 		if (txCache.containsKey(txId)) | ||||
| 			return txCache.get(txId); | ||||
| 		if(transactions.containsKey(txId)) { | ||||
| 			Tx tx = new Tx(this, transactions.get(txId)); | ||||
| 			txCache.put(txId, tx); | ||||
| 			return tx; | ||||
| 		} else { | ||||
| 			throw new IllegalArgumentException(); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	public ScvTx getScvTx(long id) { | ||||
| 		if(transactions.containsKey(id)) | ||||
| 			return transactions.get(id); | ||||
| 		else | ||||
| 			throw new IllegalArgumentException(); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the all waves. | ||||
| 	 * | ||||
| 	 * @return the all waves | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public Collection<IWaveform> getAllWaves() { | ||||
| 		ArrayList<IWaveform> ret =  new ArrayList<>(txStreams.values()); | ||||
| 		ret.addAll(txGenerators.values()); | ||||
| 		return ret; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the all relation types. | ||||
| 	 * | ||||
| 	 * @return the all relation types | ||||
| 	 */ | ||||
| 	public Collection<RelationType> getAllRelationTypes() { | ||||
| 		return relationTypes.values(); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Can load. | ||||
| 	 * | ||||
| 	 * @param inputFile the input file | ||||
| 	 * @return true, if successful | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public boolean canLoad(File inputFile) { | ||||
| 		if (!inputFile.isDirectory() && inputFile.exists()) { | ||||
| 			boolean gzipped = isGzipped(inputFile); | ||||
| 			try(InputStream stream = gzipped ? new GZIPInputStream(new FileInputStream(inputFile)) : new FileInputStream(inputFile)){ | ||||
| 				byte[] buffer = new byte[x.length]; | ||||
| 				int readCnt = stream.read(buffer, 0, x.length); | ||||
| 				if (readCnt == x.length) { | ||||
| 					for (int i = 0; i < x.length; i++) | ||||
| 						if (buffer[i] != x[i]) | ||||
| 							return false; | ||||
| 				} | ||||
| 				return true; | ||||
| 			} catch (Exception e) { | ||||
| 				return false; | ||||
| 			} | ||||
| 		} | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Checks if is gzipped. | ||||
| 	 * | ||||
| 	 * @param f the f | ||||
| 	 * @return true, if is gzipped | ||||
| 	 */ | ||||
| 	private static boolean isGzipped(File f) { | ||||
| 		try (InputStream is = new FileInputStream(f)) { | ||||
| 			byte[] signature = new byte[2]; | ||||
| 			int nread = is.read(signature); // read the gzip signature | ||||
| 			return nread == 2 && signature[0] == (byte) 0x1f && signature[1] == (byte) 0x8b; | ||||
| 		} catch (IOException e) { | ||||
| 			return false; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Load. | ||||
| 	 * | ||||
| 	 * @param db   the db | ||||
| 	 * @param file the file | ||||
| 	 * @return true, if successful | ||||
| 	 * @throws InputFormatException the input format exception | ||||
| 	 */ | ||||
| 	@SuppressWarnings("unchecked") | ||||
| 	@Override | ||||
| 	public void load(IWaveformDb db, File file) throws InputFormatException { | ||||
| 		dispose(); | ||||
| 		boolean gzipped = isGzipped(file); | ||||
| 		if (file.length() < MEMMAP_LIMIT * (gzipped ? 1 : 10) | ||||
| 				|| "memory".equals(System.getProperty("ScvBackingDB", "file"))) | ||||
| 			mapDb = DBMaker.memoryDirectDB().make(); | ||||
| 		else { | ||||
| 			File mapDbFile; | ||||
| 			try { | ||||
| 				mapDbFile = File.createTempFile("." + file.getName(), ".mapdb", null /* file.parentFile */); | ||||
| 				Files.delete(Paths.get(mapDbFile.getPath())); | ||||
| 			} catch (IOException e) { | ||||
| 				throw new InputFormatException(e.toString()); | ||||
| 			} | ||||
| 			mapDb = DBMaker.fileDB(mapDbFile).fileMmapEnable() // Always enable mmap | ||||
| 					.fileMmapPreclearDisable().allocateStartSize(MAPDB_INITIAL_ALLOC) | ||||
| 					.allocateIncrement(MAPDB_INCREMENTAL_ALLOC).cleanerHackEnable().make(); | ||||
| 			mapDbFile.deleteOnExit(); | ||||
| 		} | ||||
| 		TextDbParser parser = new TextDbParser(this); | ||||
| 		try { | ||||
| 			 | ||||
| 			parser.txSink = mapDb.hashMap("transactions", Serializer.LONG, Serializer.JAVA).create(); | ||||
| 			parser.parseInput(gzipped ? new GZIPInputStream(new FileInputStream(file)) : new FileInputStream(file)); | ||||
| 			transactions = parser.txSink; | ||||
| 		} catch (IllegalArgumentException | ArrayIndexOutOfBoundsException e) { | ||||
| 		} catch (Exception e) { | ||||
| 			throw new InputFormatException(e.toString()); | ||||
| 		} | ||||
| 		txStreams.values().parallelStream().forEach(TxStream::calculateConcurrency); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Dispose. | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public void dispose() { | ||||
| 		attrValues.clear(); | ||||
| 		relationTypes.clear(); | ||||
| 		txStreams.clear(); | ||||
| 		txGenerators.clear(); | ||||
| 		transactions = null; | ||||
| 		attributeTypes.clear(); | ||||
| 		relationsIn.clear(); | ||||
| 		relationsOut.clear(); | ||||
| 		if (mapDb != null) { | ||||
| 			mapDb.close(); | ||||
| 			mapDb = null; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * The Class TextDbParser. | ||||
| 	 */ | ||||
| 	static class TextDbParser { | ||||
|  | ||||
| 		/** The Constant scv_tr_stream. */ | ||||
| 		static final Pattern scv_tr_stream = Pattern | ||||
| 				.compile("^scv_tr_stream\\s+\\(ID (\\d+),\\s+name\\s+\"([^\"]+)\",\\s+kind\\s+\"([^\"]+)\"\\)$"); | ||||
|  | ||||
| 		/** The Constant scv_tr_generator. */ | ||||
| 		static final Pattern scv_tr_generator = Pattern | ||||
| 				.compile("^scv_tr_generator\\s+\\(ID\\s+(\\d+),\\s+name\\s+\"([^\"]+)\",\\s+scv_tr_stream\\s+(\\d+),$"); | ||||
|  | ||||
| 		/** The Constant begin_attribute. */ | ||||
| 		static final Pattern begin_attribute = Pattern | ||||
| 				.compile("^begin_attribute \\(ID (\\d+), name \"([^\"]+)\", type \"([^\"]+)\"\\)$"); | ||||
|  | ||||
| 		/** The Constant end_attribute. */ | ||||
| 		static final Pattern end_attribute = Pattern | ||||
| 				.compile("^end_attribute \\(ID (\\d+), name \"([^\"]+)\", type \"([^\"]+)\"\\)$"); | ||||
|  | ||||
| 		/** The loader. */ | ||||
| 		final TextDbLoader loader; | ||||
|  | ||||
| 		/** The transaction by id. */ | ||||
| 		HashMap<Long, ScvTx> transactionById = new HashMap<>(); | ||||
|  | ||||
| 		/** The tx sink. */ | ||||
| 		HTreeMap<Long, ScvTx> txSink; | ||||
|  | ||||
| 		/** The reader. */ | ||||
| 		BufferedReader reader = null; | ||||
|  | ||||
| 		/** The generator. */ | ||||
| 		TxGenerator generator = null; | ||||
|  | ||||
| 		/** The attr value lut. */ | ||||
| 		Map<String, Integer> attrValueLut = new HashMap<>(); | ||||
|  | ||||
| 		/** | ||||
| 		 * Instantiates a new text db parser. | ||||
| 		 * | ||||
| 		 * @param loader the loader | ||||
| 		 */ | ||||
| 		public TextDbParser(TextDbLoader loader) { | ||||
| 			super(); | ||||
| 			this.loader = loader; | ||||
| 		} | ||||
|  | ||||
| 		/** | ||||
| 		 * Parses the input. | ||||
| 		 * | ||||
| 		 * @param inputStream the input stream | ||||
| 		 * @throws IOException Signals that an I/O exception has occurred. | ||||
| 		 * @throws InputFormatException Signals that the input format is wrong | ||||
| 		 */ | ||||
| 		void parseInput(InputStream inputStream) throws IOException, InputFormatException { | ||||
| 			reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); | ||||
| 			String curLine = reader.readLine(); | ||||
| 			String nextLine = null; | ||||
| 			while ((nextLine = reader.readLine()) != null && curLine != null) { | ||||
| 				curLine = parseLine(curLine, nextLine, false); | ||||
| 			} | ||||
| 			if (curLine != null) | ||||
| 				parseLine(curLine, nextLine, true); | ||||
| 			for(Entry<Long, ScvTx> e: transactionById.entrySet()) { | ||||
| 				ScvTx scvTx = e.getValue(); | ||||
| 				scvTx.endTime=loader.maxTime; | ||||
| 				txSink.put(e.getKey(), scvTx); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		/** | ||||
| 		 * Gets the attr type. | ||||
| 		 * | ||||
| 		 * @param name     the name | ||||
| 		 * @param dataType the data type | ||||
| 		 * @param type     the type | ||||
| 		 * @return the attr type | ||||
| 		 */ | ||||
| 		private TxAttributeType getAttrType(String name, DataType dataType, AssociationType type) { | ||||
| 			String key = name + "-" + dataType.toString(); | ||||
| 			TxAttributeType res; | ||||
| 			if (loader.attributeTypes.containsKey(key)) { | ||||
| 				res = loader.attributeTypes.get(key); | ||||
| 			} else { | ||||
| 				res = new TxAttributeType(name, dataType, type); | ||||
| 				loader.attributeTypes.put(key, res); | ||||
| 			} | ||||
| 			return res; | ||||
| 		} | ||||
|  | ||||
| 		/** | ||||
| 		 * Parses the line. | ||||
| 		 * | ||||
| 		 * @param curLine  the cur line | ||||
| 		 * @param nextLine the next line | ||||
| 		 * @return the string | ||||
| 		 * @throws IOException Signals that an I/O exception has occurred. | ||||
| 		 * @throws InputFormatException Signals that the input format is wrong | ||||
| 		 */ | ||||
| 		private String parseLine(String curLine, String nextLine, boolean last) throws IOException, InputFormatException { | ||||
| 			String[] tokens = curLine.split("\\s+"); | ||||
| 			if ("tx_record_attribute".equals(tokens[0]) && tokens.length>4) { | ||||
| 				Long id = Long.parseLong(tokens[1]); | ||||
| 				String name = tokens[2].substring(1, tokens[2].length()-1); | ||||
| 				DataType type = DataType.valueOf(tokens[3]); | ||||
| 				String remaining = tokens.length > 5 ? String.join(" ", Arrays.copyOfRange(tokens, 5, tokens.length)) : ""; | ||||
| 				TxAttributeType attrType = getAttrType(name, type, AssociationType.RECORD); | ||||
| 				transactionById.get(id).attributes.add(new TxAttribute(attrType, getAttrString(attrType, remaining))); | ||||
| 			} else if ("tx_begin".equals(tokens[0]) && tokens.length>4) { | ||||
| 				Long id = Long.parseLong(tokens[1]); | ||||
| 				Long genId = Long.parseLong(tokens[2]); | ||||
| 				TxGenerator gen = loader.txGenerators.get(genId); | ||||
| 				ScvTx scvTx = new ScvTx(id, gen.stream.getId(), genId, | ||||
| 						Long.parseLong(tokens[3]) * stringToScale(tokens[4])); | ||||
| 				loader.maxTime = loader.maxTime > scvTx.beginTime ? loader.maxTime : scvTx.beginTime; | ||||
| 				if (nextLine != null && nextLine.charAt(0) == 'a') { | ||||
| 					int idx = 0; | ||||
| 					while (nextLine != null && nextLine.charAt(0) == 'a') { | ||||
| 						String[] attrTokens = nextLine.split("\\s+"); | ||||
| 						TxAttributeType attrType = gen.beginAttrs.get(idx); | ||||
| 						TxAttribute attr = new TxAttribute(attrType, getAttrString(attrType, attrTokens[1])); | ||||
| 						scvTx.attributes.add(attr); | ||||
| 						idx++; | ||||
| 						nextLine = reader.readLine(); | ||||
| 					} | ||||
| 				} | ||||
| 				transactionById.put(id, scvTx); | ||||
| 			} else if ("tx_end".equals(tokens[0]) && tokens.length>4) { | ||||
| 				Long id = Long.parseLong(tokens[1]); | ||||
| 				ScvTx scvTx = transactionById.get(id); | ||||
| 				assert Long.parseLong(tokens[2]) == scvTx.generatorId; | ||||
| 				scvTx.endTime = Long.parseLong(tokens[3]) * stringToScale(tokens[4]); | ||||
| 				loader.maxTime = loader.maxTime > scvTx.endTime ? loader.maxTime : scvTx.endTime; | ||||
| 				TxGenerator gen = loader.txGenerators.get(scvTx.generatorId); | ||||
| 				TxStream stream = loader.txStreams.get(gen.stream.getId()); | ||||
| 				if (scvTx.beginTime == scvTx.endTime) { | ||||
| 					stream.addEvent(new TxEvent(loader, EventKind.SINGLE, id, scvTx.beginTime)); | ||||
| 					gen.addEvent(new TxEvent(loader, EventKind.SINGLE, id, scvTx.beginTime)); | ||||
| 				} else { | ||||
| 					stream.addEvent(new TxEvent(loader, EventKind.BEGIN, id, scvTx.beginTime)); | ||||
| 					gen.addEvent(new TxEvent(loader, EventKind.BEGIN, id, scvTx.beginTime)); | ||||
| 					stream.addEvent(new TxEvent(loader, EventKind.END, id, scvTx.endTime)); | ||||
| 					gen.addEvent(new TxEvent(loader, EventKind.END, id, scvTx.endTime)); | ||||
| 				} | ||||
| 				if (nextLine != null && nextLine.charAt(0) == 'a') { | ||||
| 					int idx = 0; | ||||
| 					while (nextLine != null && nextLine.charAt(0) == 'a') { | ||||
| 						String[] attrTokens = nextLine.split("\\s+"); | ||||
| 						TxAttributeType attrType = gen.endAttrs.get(idx); | ||||
| 						TxAttribute attr = new TxAttribute(attrType, getAttrString(attrType, attrTokens[1])); | ||||
| 						scvTx.attributes.add(attr); | ||||
| 						idx++; | ||||
| 						nextLine = reader.readLine(); | ||||
| 					} | ||||
| 				} | ||||
| 				txSink.put(scvTx.getId(), scvTx); | ||||
| 				transactionById.remove(id); | ||||
| 			} else if ("tx_relation".equals(tokens[0]) && tokens.length>3) { | ||||
| 				Long tr2 = Long.parseLong(tokens[2]); | ||||
| 				Long tr1 = Long.parseLong(tokens[3]); | ||||
| 				String relType = tokens[1].substring(1, tokens[1].length() - 1); | ||||
| 				if (!loader.relationTypes.containsKey(relType)) | ||||
| 					loader.relationTypes.put(relType, RelationTypeFactory.create(relType)); | ||||
| 				ScvRelation rel = new ScvRelation(loader.relationTypes.get(relType), tr1, tr2); | ||||
| 				loader.relationsOut.put(tr1, rel); | ||||
| 				loader.relationsIn.put(tr2, rel); | ||||
| 			} else if ("scv_tr_stream".equals(tokens[0])) { | ||||
| 				Matcher matcher = scv_tr_stream.matcher(curLine); | ||||
| 				if (matcher.matches()) { | ||||
| 					Long id = Long.parseLong(matcher.group(1)); | ||||
| 					TxStream stream = new TxStream(loader, id, matcher.group(2), matcher.group(3)); | ||||
| 					add(id, stream); | ||||
| 				} | ||||
| 			} else if ("scv_tr_generator".equals(tokens[0])) { | ||||
| 				Matcher matcher = scv_tr_generator.matcher(curLine); | ||||
| 				if ((matcher.matches())) { | ||||
| 					Long id = Long.parseLong(matcher.group(1)); | ||||
| 					TxStream stream = loader.txStreams.get(Long.parseLong(matcher.group(3))); | ||||
| 					generator = new TxGenerator(loader, id, matcher.group(2), stream); | ||||
| 					add(id, generator); | ||||
| 				} | ||||
| 			} else if ("begin_attribute".equals(tokens[0])) { | ||||
| 				Matcher matcher = begin_attribute.matcher(curLine); | ||||
| 				if ((matcher.matches())) { | ||||
| 					TxAttributeType attrType = getAttrType(matcher.group(2), DataType.valueOf(matcher.group(3)), | ||||
| 							AssociationType.BEGIN); | ||||
| 					generator.beginAttrs.add(attrType); | ||||
| 				} | ||||
| 			} else if ("end_attribute".equals(tokens[0])) { | ||||
| 				Matcher matcher = end_attribute.matcher(curLine); | ||||
| 				if ((matcher.matches())) { | ||||
| 					TxAttributeType attrType = getAttrType(matcher.group(2), DataType.valueOf(matcher.group(3)), | ||||
| 							AssociationType.END); | ||||
| 					generator.endAttrs.add(attrType); | ||||
| 				} | ||||
| 			} else if (")".equals(tokens[0])) { | ||||
| 				generator = null; | ||||
| 			} else if(!last)			 | ||||
| 				throw new InputFormatException("Don't know what to do with: '" + curLine + "'"); | ||||
| 			return nextLine; | ||||
| 		} | ||||
|  | ||||
| 		/** | ||||
| 		 * Gets the attr string. | ||||
| 		 * | ||||
| 		 * @param attrType the attr type | ||||
| 		 * @param string   the string | ||||
| 		 * @return the attr string | ||||
| 		 */ | ||||
| 		private String getAttrString(TxAttributeType attrType, String string) { | ||||
| 			String value; | ||||
| 			switch (attrType.getDataType()) { | ||||
| 			case STRING: | ||||
| 			case ENUMERATION: | ||||
| 				value = string.substring(1, string.length() - 1); | ||||
| 				break; | ||||
| 			default: | ||||
| 				value = string; | ||||
| 			} | ||||
| 			if (attrValueLut.containsKey(value)) { | ||||
| 				return loader.attrValues.get(attrValueLut.get(value)); | ||||
| 			} else { | ||||
| 				attrValueLut.put(value, loader.attrValues.size()); | ||||
| 				loader.attrValues.add(value); | ||||
| 				return value; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		/** | ||||
| 		 * String to scale. | ||||
| 		 * | ||||
| 		 * @param scale the scale | ||||
| 		 * @return the long | ||||
| 		 */ | ||||
| 		private long stringToScale(String scale) { | ||||
| 			String cmp = scale.trim(); | ||||
| 			if ("fs".equals(cmp)) | ||||
| 				return 1L; | ||||
| 			if ("ps".equals(cmp)) | ||||
| 				return 1000L; | ||||
| 			if ("ns".equals(cmp)) | ||||
| 				return 1000000L; | ||||
| 			if ("us".equals(cmp)) | ||||
| 				return 1000000000L; | ||||
| 			if ("ms".equals(cmp)) | ||||
| 				return 1000000000000L; | ||||
| 			if ("s".equals(cmp)) | ||||
| 				return 1000000000000000L; | ||||
| 			return 1L; | ||||
| 		} | ||||
| 		private void add(Long id, TxStream stream) { | ||||
| 			loader.txStreams.put(id, stream); | ||||
| 			loader.pcs.firePropertyChange(IWaveformDbLoader.STREAM_ADDED, null, stream); | ||||
| 		} | ||||
|  | ||||
| 		private void add(Long id, TxGenerator generator) { | ||||
| 			loader.txGenerators.put(id, generator); | ||||
| 			loader.pcs.firePropertyChange(IWaveformDbLoader.GENERATOR_ADDED, null, generator); | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,77 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2012 IT Just working. | ||||
|  * Copyright (c) 2020 MINRES Technologies GmbH | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     IT Just working - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.io.FileInputStream; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.util.zip.GZIPInputStream; | ||||
|  | ||||
| import com.minres.scviewer.database.IWaveformDbLoader; | ||||
| import com.minres.scviewer.database.IWaveformDbLoaderFactory; | ||||
|  | ||||
| /** | ||||
|  * The Class TextDbLoader. | ||||
|  */ | ||||
| public class TextDbLoaderFactory implements IWaveformDbLoaderFactory { | ||||
|  | ||||
| 	/** The Constant x. */ | ||||
| 	static final byte[] x = "scv_tr_stream".getBytes(); | ||||
|  | ||||
| 	/** | ||||
| 	 * Checks if f is gzipped. | ||||
| 	 * | ||||
| 	 * @param f the f | ||||
| 	 * @return true, if is gzipped | ||||
| 	 */ | ||||
| 	private static boolean isGzipped(File f) { | ||||
| 		try (InputStream is = new FileInputStream(f)) { | ||||
| 			byte[] signature = new byte[2]; | ||||
| 			int nread = is.read(signature); // read the gzip signature | ||||
| 			return nread == 2 && signature[0] == (byte) 0x1f && signature[1] == (byte) 0x8b; | ||||
| 		} catch (IOException e) { | ||||
| 			return false; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Can load. | ||||
| 	 * | ||||
| 	 * @param inputFile the input file | ||||
| 	 * @return true, if successful | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public boolean canLoad(File inputFile) { | ||||
| 		if (!inputFile.isDirectory() && inputFile.exists()) { | ||||
| 			boolean gzipped = isGzipped(inputFile); | ||||
| 			try(InputStream stream = gzipped ? new GZIPInputStream(new FileInputStream(inputFile)) : new FileInputStream(inputFile)){ | ||||
| 				byte[] buffer = new byte[x.length]; | ||||
| 				int readCnt = stream.read(buffer, 0, x.length); | ||||
| 				if (readCnt == x.length) { | ||||
| 					for (int i = 0; i < x.length; i++) | ||||
| 						if (buffer[i] != x[i]) | ||||
| 							return false; | ||||
| 				} | ||||
| 				return true; | ||||
| 			} catch (Exception e) { | ||||
| 				return false; | ||||
| 			} | ||||
| 		} | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public IWaveformDbLoader getLoader() { | ||||
| 		return new TextDbLoader(); | ||||
| 	} | ||||
| } | ||||
| @@ -1,67 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2012 IT Just working. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     IT Just working - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text | ||||
|  | ||||
| import com.minres.scviewer.database.* | ||||
|  | ||||
| class Tx implements ITx { | ||||
| 	 | ||||
| 	Long id | ||||
| 	 | ||||
| 	TxGenerator generator | ||||
|  | ||||
| 	TxStream stream | ||||
| 	 | ||||
| 	int concurrencyIndex | ||||
| 	 | ||||
| 	Long beginTime | ||||
| 	 | ||||
| 	Long endTime | ||||
| 	 | ||||
| 	ArrayList<ITxAttribute> attributes = new ArrayList<ITxAttribute>() | ||||
| 	 | ||||
| 	def incomingRelations =[] | ||||
| 	 | ||||
| 	def outgoingRelations =[] | ||||
| 	 | ||||
| 	Tx(int id, TxStream stream, TxGenerator generator, Long begin){ | ||||
| 		this.id=id | ||||
| 		this.stream=stream | ||||
| 		this.generator=generator | ||||
| 		this.beginTime=begin | ||||
|         this.endTime=begin | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public Collection<ITxRelation> getIncomingRelations() { | ||||
| 		return incomingRelations; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public Collection<ITxRelation> getOutgoingRelations() { | ||||
| 		return outgoingRelations; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public int compareTo(ITx o) { | ||||
| 		def res =beginTime.compareTo(o.beginTime) | ||||
| 		if(res!=0)  | ||||
| 			return res | ||||
| 		else | ||||
| 			return id.compareTo(o.id) | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public String toString() { | ||||
| 		return "tx#"+getId()+"["+getBeginTime()/1000000+"ns - "+getEndTime()/1000000+"ns]"; | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,231 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2012 IT Just working. | ||||
|  * Copyright (c) 2020 MINRES Technologies GmbH | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     IT Just working - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text; | ||||
|  | ||||
| import java.util.Collection; | ||||
| import java.util.List; | ||||
| import java.util.Set; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| import com.minres.scviewer.database.IWaveform; | ||||
| import com.minres.scviewer.database.tx.ITx; | ||||
| import com.minres.scviewer.database.tx.ITxAttribute; | ||||
| import com.minres.scviewer.database.tx.ITxRelation; | ||||
|  | ||||
| /** | ||||
|  * The Class Tx. | ||||
|  */ | ||||
| class Tx implements ITx { | ||||
|  | ||||
| 	/** The loader. */ | ||||
| 	private final TextDbLoader loader; | ||||
| 	 | ||||
| 	private ScvTx scvTx =null; | ||||
|  | ||||
| 	/** The id. */ | ||||
| 	private final long id; | ||||
|  | ||||
| 	private final long generatorId; | ||||
|  | ||||
| 	private final long streamId; | ||||
|  | ||||
| 	/** The begin time. */ | ||||
| 	long beginTime = -1; | ||||
|  | ||||
| 	/** The end time. */ | ||||
| 	long endTime = -1; | ||||
|  | ||||
| 	/** | ||||
| 	 * Instantiates a new tx. | ||||
| 	 * | ||||
| 	 * @param loader the loader | ||||
| 	 * @param scvTx  the scv tx | ||||
| 	 */ | ||||
| 	public Tx(TextDbLoader loader, ScvTx scvTx) { | ||||
| 		this.loader = loader; | ||||
| 		id = scvTx.id; | ||||
| 		generatorId=scvTx.generatorId; | ||||
| 		streamId=scvTx.streamId; | ||||
| 		beginTime=scvTx.beginTime; | ||||
| 		endTime=scvTx.endTime; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Instantiates a new tx. | ||||
| 	 * | ||||
| 	 * @param loader the loader | ||||
| 	 * @param txId   the tx id | ||||
| 	 */ | ||||
| 	public Tx(TextDbLoader loader, long id, long generatorId,  long streamId) { | ||||
| 		this.loader = loader; | ||||
| 		this.id = id; | ||||
| 		this.generatorId=generatorId; | ||||
| 		this.streamId = streamId; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the incoming relations. | ||||
| 	 * | ||||
| 	 * @return the incoming relations | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public Collection<ITxRelation> getIncomingRelations() { | ||||
| 		Set<ScvRelation> rels = loader.relationsIn.get(id); | ||||
| 		return rels.stream().map(rel -> new TxRelation(loader, rel)).collect(Collectors.toList()); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the outgoing relations. | ||||
| 	 * | ||||
| 	 * @return the outgoing relations | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public Collection<ITxRelation> getOutgoingRelations() { | ||||
| 		Set<ScvRelation> rels = loader.relationsOut.get(id); | ||||
| 		return rels.stream().map(rel -> new TxRelation(loader, rel)).collect(Collectors.toList()); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Compare to. | ||||
| 	 * | ||||
| 	 * @param o the o | ||||
| 	 * @return the int | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public int compareTo(ITx o) { | ||||
| 		int res = Long.compare(getBeginTime(), o.getBeginTime()); | ||||
| 		if (res != 0) | ||||
| 			return res; | ||||
| 		else | ||||
| 			return Long.compare(getId(), o.getId()); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Equals. | ||||
| 	 * | ||||
| 	 * @param obj the obj | ||||
| 	 * @return true, if successful | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public boolean equals(Object obj) { | ||||
| 		if (this == obj) | ||||
| 			return true; | ||||
| 		if (obj == null || getClass() != obj.getClass()) | ||||
| 			return false; | ||||
| 		return this.getScvTx().equals(((Tx) obj).getScvTx()); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Hash code. | ||||
| 	 * | ||||
| 	 * @return the int | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public int hashCode() { | ||||
| 		return getScvTx().hashCode(); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * To string. | ||||
| 	 * | ||||
| 	 * @return the string | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public String toString() { | ||||
| 		return "tx#" + getId() + "[" + getBeginTime() / 1000000 + "ns - " + getEndTime() / 1000000 + "ns]"; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the id. | ||||
| 	 * | ||||
| 	 * @return the id | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public long getId() { | ||||
| 		return getScvTx().id; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the stream. | ||||
| 	 * | ||||
| 	 * @return the stream | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public IWaveform getStream() { | ||||
| 		return loader.txStreams.get(streamId); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the generator. | ||||
| 	 * | ||||
| 	 * @return the generator | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public IWaveform getGenerator() { | ||||
| 		return loader.txGenerators.get(generatorId); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the begin time. | ||||
| 	 * | ||||
| 	 * @return the begin time | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public long getBeginTime() { | ||||
| 		if (beginTime < 0) { | ||||
| 			ScvTx tx = scvTx==null?loader.getScvTx(id):getScvTx(); | ||||
| 			beginTime = tx.beginTime; | ||||
| 			endTime = tx.endTime; | ||||
| 		} | ||||
| 		return beginTime; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the end time. | ||||
| 	 * | ||||
| 	 * @return the end time | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public long getEndTime() { | ||||
| 		if (endTime < 0) { | ||||
| 			ScvTx tx = scvTx==null?loader.getScvTx(id):getScvTx(); | ||||
| 			beginTime = tx.beginTime; | ||||
| 			endTime = tx.endTime; | ||||
| 		} | ||||
| 		return endTime; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Sets the end time. | ||||
| 	 * | ||||
| 	 * @param time the new end time | ||||
| 	 */ | ||||
| 	void setEndTime(Long time) { | ||||
| 		getScvTx().endTime = time; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the attributes. | ||||
| 	 * | ||||
| 	 * @return the attributes | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public List<ITxAttribute> getAttributes() { | ||||
| 		return getScvTx().attributes; | ||||
| 	} | ||||
|  | ||||
| 	private ScvTx getScvTx() { | ||||
| 		if(scvTx==null) | ||||
| 			scvTx=loader.getScvTx(id); | ||||
| 		return scvTx; | ||||
| 	} | ||||
| } | ||||
| @@ -1,59 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2012 IT Just working. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     IT Just working - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text | ||||
|  | ||||
| import com.minres.scviewer.database.AssociationType; | ||||
| import com.minres.scviewer.database.DataType; | ||||
| import com.minres.scviewer.database.ITxAttributeType; | ||||
| import com.minres.scviewer.database.ITxAttribute | ||||
|  | ||||
| class TxAttribute  implements ITxAttribute{ | ||||
| 	 | ||||
| 	TxAttributeType attributeType | ||||
|  | ||||
| 	def value | ||||
| 	 | ||||
| 	TxAttribute(String name, DataType dataType, AssociationType type, value){ | ||||
| 		attributeType = TxAttributeTypeFactory.instance.getAttrType(name, dataType, type) | ||||
| 		switch(dataType){ | ||||
| 			case DataType.STRING: | ||||
| 			case DataType.ENUMERATION: | ||||
| 				this.value=value[1..-2] | ||||
| 				break; | ||||
| 			default: | ||||
| 				this.value=value | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	TxAttribute(TxAttributeType other){ | ||||
| 		attributeType=other | ||||
| 	} | ||||
| 	 | ||||
| 	TxAttribute(TxAttributeType other, value){ | ||||
| 		this(other.name, other.dataType, other.type, value) | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getName() { | ||||
| 		return attributeType.getName(); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public AssociationType getType() { | ||||
| 		attributeType.type; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public DataType getDataType() { | ||||
| 		attributeType.dataType; | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,85 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2012 IT Just working. | ||||
|  * Copyright (c) 2020 MINRES Technologies GmbH | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     IT Just working - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text; | ||||
|  | ||||
| import java.io.Serializable; | ||||
|  | ||||
| import com.minres.scviewer.database.AssociationType; | ||||
| import com.minres.scviewer.database.DataType; | ||||
| import com.minres.scviewer.database.tx.ITxAttribute; | ||||
|  | ||||
| /** | ||||
|  * The Class TxAttribute. | ||||
|  */ | ||||
| public class TxAttribute implements ITxAttribute, Serializable { | ||||
|  | ||||
| 	/** The Constant serialVersionUID. */ | ||||
| 	private static final long serialVersionUID = 4767726016651807152L; | ||||
|  | ||||
| 	/** The attribute type. */ | ||||
| 	private final TxAttributeType attributeType; | ||||
|  | ||||
| 	/** The value. */ | ||||
| 	private final String value; | ||||
|  | ||||
| 	/** | ||||
| 	 * Instantiates a new tx attribute. | ||||
| 	 * | ||||
| 	 * @param type  the type | ||||
| 	 * @param value the value | ||||
| 	 */ | ||||
| 	TxAttribute(TxAttributeType type, String value) { | ||||
| 		this.attributeType = type; | ||||
| 		this.value = value; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the name. | ||||
| 	 * | ||||
| 	 * @return the name | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public String getName() { | ||||
| 		return attributeType.getName(); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the type. | ||||
| 	 * | ||||
| 	 * @return the type | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public AssociationType getType() { | ||||
| 		return attributeType.getType(); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the data type. | ||||
| 	 * | ||||
| 	 * @return the data type | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public DataType getDataType() { | ||||
| 		return attributeType.getDataType(); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the value. | ||||
| 	 * | ||||
| 	 * @return the value | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public Object getValue() { | ||||
| 		return value; | ||||
| 	} | ||||
|  | ||||
| } | ||||
| @@ -1,31 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2012 IT Just working. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     IT Just working - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text | ||||
|  | ||||
| import com.minres.scviewer.database.AssociationType; | ||||
| import com.minres.scviewer.database.DataType; | ||||
| import com.minres.scviewer.database.ITxAttributeType; | ||||
|  | ||||
| class TxAttributeType implements ITxAttributeType { | ||||
| 	String name | ||||
| 	DataType dataType | ||||
| 	AssociationType type | ||||
| 	 | ||||
| 	static TxAttributeType getAttrType(String name, DataType dataType, AssociationType type){ | ||||
| 		TxAttributeTypeFactory.instance.getAttrType(name, dataType, type) | ||||
| 	} | ||||
| 	 | ||||
| 	TxAttributeType(String name, DataType dataType, AssociationType type){ | ||||
| 		this.name=name | ||||
| 		this.dataType=dataType | ||||
| 		this.type=type | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,79 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2012 IT Just working. | ||||
|  * Copyright (c) 2020 MINRES Technologies GmbH | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     IT Just working - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text; | ||||
|  | ||||
| import java.io.Serializable; | ||||
|  | ||||
| import com.minres.scviewer.database.AssociationType; | ||||
| import com.minres.scviewer.database.DataType; | ||||
| import com.minres.scviewer.database.tx.ITxAttributeType; | ||||
|  | ||||
| /** | ||||
|  * The Class TxAttributeType. | ||||
|  */ | ||||
| class TxAttributeType implements ITxAttributeType, Serializable { | ||||
|  | ||||
| 	/** The Constant serialVersionUID. */ | ||||
| 	private static final long serialVersionUID = 7159721937208946828L; | ||||
|  | ||||
| 	/** The name. */ | ||||
| 	private String name; | ||||
|  | ||||
| 	/** The data type. */ | ||||
| 	private DataType dataType; | ||||
|  | ||||
| 	/** The type. */ | ||||
| 	private AssociationType type; | ||||
|  | ||||
| 	/** | ||||
| 	 * Instantiates a new tx attribute type. | ||||
| 	 * | ||||
| 	 * @param name     the name | ||||
| 	 * @param dataType the data type | ||||
| 	 * @param type     the type | ||||
| 	 */ | ||||
| 	TxAttributeType(String name, DataType dataType, AssociationType type) { | ||||
| 		this.name = name; | ||||
| 		this.dataType = dataType; | ||||
| 		this.type = type; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the name. | ||||
| 	 * | ||||
| 	 * @return the name | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public String getName() { | ||||
| 		return name; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the data type. | ||||
| 	 * | ||||
| 	 * @return the data type | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public DataType getDataType() { | ||||
| 		return dataType; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the type. | ||||
| 	 * | ||||
| 	 * @return the type | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public AssociationType getType() { | ||||
| 		return type; | ||||
| 	} | ||||
| } | ||||
| @@ -1,38 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2012 IT Just working. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     IT Just working - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text | ||||
|  | ||||
| import com.minres.scviewer.database.AssociationType; | ||||
| import com.minres.scviewer.database.DataType | ||||
| import com.minres.scviewer.database.ITxAttributeType | ||||
| import com.minres.scviewer.database.ITxAttribute | ||||
|  | ||||
| class TxAttributeTypeFactory { | ||||
| 	private static final instance = new TxAttributeTypeFactory() | ||||
| 	 | ||||
| 	def attributes = [:] | ||||
| 	 | ||||
| 	private TxAttributeTypeFactory() { | ||||
| 		TxAttributeTypeFactory.metaClass.constructor = {-> instance } | ||||
| 	} | ||||
| 	 | ||||
| 	ITxAttributeType getAttrType(String name, DataType dataType, AssociationType type){ | ||||
| 		def key = name+":"+dataType.toString() | ||||
| 		ITxAttributeType res | ||||
| 		if(attributes.containsKey(key)){ | ||||
| 			res=attributes[key] | ||||
| 		} else { | ||||
| 			res=new TxAttributeType(name, dataType, type) | ||||
| 			attributes[key]=res | ||||
| 		} | ||||
| 		return res | ||||
| 	} | ||||
| } | ||||
| @@ -1,36 +0,0 @@ | ||||
| package com.minres.scviewer.database.text; | ||||
|  | ||||
| import com.minres.scviewer.database.ITx | ||||
| import com.minres.scviewer.database.ITxEvent | ||||
| import com.minres.scviewer.database.IWaveformEvent | ||||
|  | ||||
| class TxEvent implements ITxEvent { | ||||
|  | ||||
| 	final ITxEvent.Type type; | ||||
| 	 | ||||
| 	final Tx transaction; | ||||
| 	 | ||||
| 	final Long time | ||||
| 	 | ||||
| 	TxEvent(ITxEvent.Type type, ITx transaction) { | ||||
| 		super(); | ||||
| 		this.type = type; | ||||
| 		this.transaction = transaction; | ||||
| 		this.time = type==ITxEvent.Type.BEGIN?transaction.beginTime:transaction.endTime | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	IWaveformEvent duplicate() throws CloneNotSupportedException { | ||||
| 		new TxEvent(type, transaction, time) | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	int compareTo(IWaveformEvent o) { | ||||
| 		time.compareTo(o.time) | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	String toString() { | ||||
| 		type.toString()+"@"+time+" of tx #"+transaction.id; | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,120 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2020 MINRES Technologies GmbH 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: | ||||
|  *     MINRES Technologies GmbH - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text; | ||||
|  | ||||
| import com.minres.scviewer.database.EventKind; | ||||
| import com.minres.scviewer.database.WaveformType; | ||||
| import com.minres.scviewer.database.tx.ITx; | ||||
| import com.minres.scviewer.database.tx.ITxEvent; | ||||
|  | ||||
| /** | ||||
|  * The Class TxEvent. | ||||
|  */ | ||||
| class TxEvent implements ITxEvent { | ||||
|  | ||||
| 	/** The loader. */ | ||||
| 	final TextDbLoader loader; | ||||
|  | ||||
| 	/** The kind. */ | ||||
| 	final EventKind kind; | ||||
|  | ||||
| 	/** The transaction. */ | ||||
| 	final long transaction; | ||||
|  | ||||
| 	/** The time. */ | ||||
| 	final long time; | ||||
|  | ||||
| 	private int concurrencyIdx=-1; | ||||
| 	/** | ||||
| 	 * Instantiates a new tx event. | ||||
| 	 * | ||||
| 	 * @param loader      the loader | ||||
| 	 * @param kind        the kind | ||||
| 	 * @param transaction the transaction | ||||
| 	 * @param time        the time | ||||
| 	 */ | ||||
| 	TxEvent(TextDbLoader loader, EventKind kind, Long transaction, Long time) { | ||||
| 		this.loader = loader; | ||||
| 		this.kind = kind; | ||||
| 		this.transaction = transaction; | ||||
| 		this.time = time; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Duplicate. | ||||
| 	 * | ||||
| 	 * @return the i tx event | ||||
| 	 * @throws CloneNotSupportedException the clone not supported exception | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public ITxEvent duplicate() throws CloneNotSupportedException { | ||||
| 		return new TxEvent(loader, kind, transaction, time); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * To string. | ||||
| 	 * | ||||
| 	 * @return the string | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public String toString() { | ||||
| 		return kind.toString() + "@" + time + " of tx #" + transaction; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the type. | ||||
| 	 * | ||||
| 	 * @return the type | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public WaveformType getType() { | ||||
| 		return WaveformType.TRANSACTION; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the kind. | ||||
| 	 * | ||||
| 	 * @return the kind | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public EventKind getKind() { | ||||
| 		return kind; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the time. | ||||
| 	 * | ||||
| 	 * @return the time | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public long getTime() { | ||||
| 		return time; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the transaction. | ||||
| 	 * | ||||
| 	 * @return the transaction | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public ITx getTransaction() { | ||||
| 		return loader.getTransaction(transaction); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public int getRowIndex() { | ||||
| 		return concurrencyIdx; | ||||
| 	} | ||||
|  | ||||
| 	public void setConcurrencyIndex(int idx) { | ||||
| 		concurrencyIdx=idx; | ||||
| 	} | ||||
| } | ||||
| @@ -1,52 +0,0 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2012 IT Just working. | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     IT Just working - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
|  | ||||
| import com.minres.scviewer.database.ITxAttributeType | ||||
| import com.minres.scviewer.database.ITxAttribute; | ||||
| import com.minres.scviewer.database.ITxEvent; | ||||
| import com.minres.scviewer.database.ITxGenerator; | ||||
| import com.minres.scviewer.database.ITxStream; | ||||
| import com.minres.scviewer.database.ITx; | ||||
| import com.minres.scviewer.database.IWaveformEvent; | ||||
|  | ||||
| class TxGenerator implements ITxGenerator{ | ||||
| 	Long id | ||||
| 	TxStream stream | ||||
| 	String name | ||||
| 	Boolean active = false | ||||
| 	ArrayList<ITx> transactions=[] | ||||
| 	 | ||||
| 	ArrayList<ITxAttributeType> begin_attrs = [] | ||||
| 	int begin_attrs_idx = 0 | ||||
| 	ArrayList<ITxAttributeType> end_attrs= [] | ||||
| 	int end_attrs_idx = 0 | ||||
| 	 | ||||
| 	TxGenerator(int id, TxStream stream, name){ | ||||
| 		this.id=id | ||||
| 		this.stream=stream | ||||
| 		this.name=name | ||||
| 	} | ||||
| 	 | ||||
| 	ITxStream<? extends ITxEvent> getStream(){ | ||||
| 		return stream; | ||||
| 	} | ||||
| 	 | ||||
| 	List<ITx> getTransactions(){ | ||||
| 		return transactions | ||||
| 	} | ||||
| 	 | ||||
| 	Boolean isActive() {return active}; | ||||
| 	 | ||||
| } | ||||
| @@ -0,0 +1,96 @@ | ||||
| /******************************************************************************* | ||||
|  * Copyright (c) 2012 IT Just working. | ||||
|  * Copyright (c) 2020 MINRES Technologies GmbH | ||||
|  * All rights reserved. This program and the accompanying materials | ||||
|  * are made available under the terms of the Eclipse Public License v1.0 | ||||
|  * which accompanies this distribution, and is available at | ||||
|  * http://www.eclipse.org/legal/epl-v10.html | ||||
|  * | ||||
|  * Contributors: | ||||
|  *     IT Just working - initial API and implementation | ||||
|  *******************************************************************************/ | ||||
| package com.minres.scviewer.database.text; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
|  | ||||
| import com.minres.scviewer.database.IWaveform; | ||||
|  | ||||
| /** | ||||
|  * The Class TxGenerator. | ||||
|  */ | ||||
| class TxGenerator extends AbstractTxStream { | ||||
|  | ||||
| 	/** The stream. */ | ||||
| 	TxStream stream; | ||||
|  | ||||
| 	/** The begin attrs. */ | ||||
| 	List<TxAttributeType> beginAttrs = new ArrayList<>(); | ||||
|  | ||||
| 	/** The end attrs. */ | ||||
| 	List<TxAttributeType> endAttrs = new ArrayList<>(); | ||||
|  | ||||
| 	/** | ||||
| 	 * Instantiates a new tx generator. | ||||
| 	 * | ||||
| 	 * @param loader the loader | ||||
| 	 * @param id     the id | ||||
| 	 * @param name   the name | ||||
| 	 * @param stream the stream | ||||
| 	 */ | ||||
| 	TxGenerator(TextDbLoader loader, Long id, String name, TxStream stream) { | ||||
| 		super(loader, id, name); | ||||
| 		this.stream = stream; | ||||
| 		stream.addChild(this); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Checks if is same. | ||||
| 	 * | ||||
| 	 * @param other the other | ||||
| 	 * @return true, if is same | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public boolean isSame(IWaveform other) { | ||||
| 		return (other instanceof TxGenerator && this.getId()==other.getId()); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the begin attrs. | ||||
| 	 * | ||||
| 	 * @return the begin attrs | ||||
| 	 */ | ||||
| 	public List<TxAttributeType> getBeginAttrs() { | ||||
| 		return beginAttrs; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the end attrs. | ||||
| 	 * | ||||
| 	 * @return the end attrs | ||||
| 	 */ | ||||
| 	public List<TxAttributeType> getEndAttrs() { | ||||
| 		return endAttrs; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the kind. | ||||
| 	 * | ||||
| 	 * @return the kind | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public String getKind() { | ||||
| 		return stream.getKind(); | ||||
| 	} | ||||
| 	 | ||||
| 	/** | ||||
| 	 * Gets the full hierarchical name. | ||||
| 	 * | ||||
| 	 * @return the full name | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public String getFullName() { | ||||
| 		return  ((AbstractTxStream)parent).getFullName()+"."+name; | ||||
| 	} | ||||
|  | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user