Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Search (basic) #129

Merged
merged 3 commits into from
Jun 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.ulyp.core.recorders;

import com.ulyp.core.Type;
import lombok.Getter;

@Getter
public class IdentityObjectRecord extends ObjectRecord {

private final int hashCode;
Expand All @@ -11,12 +13,8 @@ public IdentityObjectRecord(Type type, int hashCode) {
this.hashCode = hashCode;
}

public int getHashCode() {
return hashCode;
}

@Override
public String toString() {
return getType().getName() + "@" + hashCode;
return getType().getName() + "@" + Integer.toHexString(hashCode);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,8 @@ private JobRunner(RecordingDataReaderJob job, File file) throws IOException {
@Override
public void run() {
try (BinaryListFileReader reader = new BinaryListFileReader(file)) {
job.onStart();

while (!Thread.currentThread().isInterrupted()) {

try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

public interface RecordingDataReaderJob {

default void onStart() {}

void onProcessMetadata(ProcessMetadata processMetadata);

void onRecordingMetadata(RecordingMetadata recordingMetadata);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,31 +6,30 @@
import com.ulyp.core.Type;
import com.ulyp.core.repository.ReadableRepository;
import com.ulyp.core.util.StringUtils;
import com.ulyp.storage.search.SearchQuery;

public class PlainTextSearchQuery implements SearchQuery {

private final String searchQuery;
private final String textToSearch;

public PlainTextSearchQuery(String searchQuery) {
this.searchQuery = searchQuery;
public PlainTextSearchQuery(String textToSearch) {
this.textToSearch = textToSearch;
}

@Override
public boolean matches(
RecordedEnterMethodCall recordedEnterMethodCall,
RecordedEnterMethodCall methodCall,
ReadableRepository<Integer, Type> types,
ReadableRepository<Integer, Method> methods) {
return StringUtils.containsIgnoreCase(recordedEnterMethodCall.getCallee().toString(), searchQuery)
|| recordedEnterMethodCall.getArguments().stream().anyMatch(arg -> StringUtils.containsIgnoreCase(arg.toString(), searchQuery))
|| StringUtils.containsIgnoreCase(methods.get(recordedEnterMethodCall.getMethodId()).getName(), searchQuery);
return StringUtils.containsIgnoreCase(methodCall.getCallee().toString(), textToSearch)
|| methodCall.getArguments().stream().anyMatch(arg -> StringUtils.containsIgnoreCase(arg.toString(), textToSearch))
|| StringUtils.containsIgnoreCase(methods.get(methodCall.getMethodId()).getName(), textToSearch);
}

@Override
public boolean matches(
RecordedExitMethodCall recordedExitMethodCall,
RecordedExitMethodCall methodCall,
ReadableRepository<Integer, Type> typeResolver,
ReadableRepository<Integer, Method> methods) {
return StringUtils.containsIgnoreCase(recordedExitMethodCall.getReturnValue().toString(), searchQuery);
return StringUtils.containsIgnoreCase(methodCall.getReturnValue().toString(), textToSearch);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package com.ulyp.storage.search;

import com.ulyp.core.*;
import com.ulyp.core.repository.InMemoryRepository;
import com.ulyp.core.repository.Repository;
import com.ulyp.storage.reader.RecordedMethodCalls;
import com.ulyp.storage.reader.RecordingDataReaderJob;

public class SearchDataReaderJob implements RecordingDataReaderJob {

private final SearchQuery query;
private final SearchResultListener resultListener;
private final InMemoryRepository<Integer, Type> types = new InMemoryRepository<>();
private final Repository<Integer, Method> methods = new InMemoryRepository<>();

public SearchDataReaderJob(SearchQuery query, SearchResultListener resultListener) {
this.query = query;
this.resultListener = resultListener;
}

@Override
public void onStart() {
resultListener.onStart();
}

@Override
public void onProcessMetadata(ProcessMetadata processMetadata) {

}

@Override
public void onRecordingMetadata(RecordingMetadata recordingMetadata) {

}

@Override
public void onType(Type type) {
types.store(type.getId(), type);
}

@Override
public void onMethod(Method method) {
methods.store(method.getId(), method);
}

@Override
public void onRecordedCalls(long address, RecordedMethodCalls recordedMethodCalls) {
if (recordedMethodCalls.isEmpty()) {
return;
}

AddressableItemIterator<RecordedMethodCall> it = recordedMethodCalls.iterator(types);
while (it.hasNext()) {
RecordedMethodCall methodCall = it.next();

if (methodCall instanceof RecordedEnterMethodCall) {
RecordedEnterMethodCall enterMethodCall = (RecordedEnterMethodCall) methodCall;

if (query.matches(enterMethodCall, types, methods)) {
resultListener.onMatch(recordedMethodCalls.getRecordingId(), enterMethodCall);
}
} else {
RecordedExitMethodCall exitMethodCall = (RecordedExitMethodCall) methodCall;

if (query.matches(exitMethodCall, types, methods)) {
resultListener.onMatch(recordedMethodCalls.getRecordingId(), exitMethodCall);
}
}
}
}

@Override
public boolean continueOnNoData() {
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ public interface SearchResultListener {

void onStart();

void onMatch(RecordedEnterMethodCall enterMethodCall);
void onMatch(int recordingId, RecordedEnterMethodCall enterMethodCall);

void onMatch(RecordedExitMethodCall exitMethodCall);
void onMatch(int recordingId, RecordedExitMethodCall exitMethodCall);

void onEnd();
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,12 @@ public void onStart() {
}

@Override
public void onMatch(RecordedEnterMethodCall enterMethodCall) {
public void onMatch(int recordingId, RecordedEnterMethodCall enterMethodCall) {
matchedCalls.add(enterMethodCall);
}

@Override
public void onMatch(RecordedExitMethodCall exitMethodCall) {
public void onMatch(int recordingId, RecordedExitMethodCall exitMethodCall) {
matchedCalls.add(exitMethodCall);
}

Expand Down
6 changes: 3 additions & 3 deletions ulyp-ui/src/main/kotlin/com/ulyp/ui/Configuration.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import com.ulyp.ui.code.SourceCodeView
import com.ulyp.ui.elements.recording.tree.FileRecordingTabPane
import com.ulyp.ui.looknfeel.FontStyleUpdater
import com.ulyp.ui.reader.FilterRegistry
import com.ulyp.ui.reader.RecordingReaderRegistry
import com.ulyp.ui.reader.ReaderRegistry
import com.ulyp.ui.settings.Settings
import com.ulyp.ui.settings.SettingsFileStorage
import com.ulyp.ui.settings.defaults.SettingsFileProvider
Expand Down Expand Up @@ -39,7 +39,7 @@ open class Configuration {
@Lazy
open fun primaryView(
applicationContext: ApplicationContext,
recordingReaderRegistry: RecordingReaderRegistry,
readerRegistry: ReaderRegistry,
sourceCodeView: SourceCodeView,
fileRecordingTabPane: FileRecordingTabPane,
settings: Settings,
Expand All @@ -53,7 +53,7 @@ open class Configuration {
applicationContext,
viewInitializer,
sourceCodeView,
recordingReaderRegistry,
readerRegistry,
fileRecordingTabPane,
settings
) { fileChooser.showOpenDialog(stage) }
Expand Down
6 changes: 3 additions & 3 deletions ulyp-ui/src/main/kotlin/com/ulyp/ui/PrimaryView.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import com.ulyp.ui.elements.controls.ErrorModalView
import com.ulyp.ui.elements.misc.ExceptionAsTextView
import com.ulyp.ui.elements.recording.tree.FileRecordingTabPane
import com.ulyp.ui.elements.recording.tree.FileRecordingsTabName
import com.ulyp.ui.reader.RecordingReaderRegistry
import com.ulyp.ui.reader.ReaderRegistry
import com.ulyp.ui.settings.Settings
import com.ulyp.ui.util.FxThreadExecutor
import javafx.fxml.FXML
Expand All @@ -33,7 +33,7 @@ class PrimaryView(
private val applicationContext: ApplicationContext,
private val viewInitializer: ViewInitializer,
private val sourceCodeView: SourceCodeView,
private val readerRegistry: RecordingReaderRegistry,
private val readerRegistry: ReaderRegistry,
private val fileRecordingTabPane: FileRecordingTabPane,
private val settings: Settings,
private val fileChooser: Supplier<File?>
Expand Down Expand Up @@ -101,7 +101,7 @@ class PrimaryView(
val stage = Stage()
stage.scene = scene
stage.isMaximized = false
stage.title = "Search"
stage.title = "Search (Experimental)"
val iconStream = UIApplication::class.java.classLoader.getResourceAsStream("icons/settings-icon.png") ?: throw UlypException("Icon not found")
stage.icons.add(Image(iconStream))
stage.show()
Expand Down
28 changes: 18 additions & 10 deletions ulyp-ui/src/main/kotlin/com/ulyp/ui/SearchView.kt
Original file line number Diff line number Diff line change
@@ -1,38 +1,46 @@
package com.ulyp.ui

import com.ulyp.storage.search.PlainTextSearchQuery
import com.ulyp.storage.search.SearchDataReaderJob
import com.ulyp.ui.elements.recording.tree.FileRecordingTabPane
import com.ulyp.ui.elements.recording.tree.FileRecordingsTab
import com.ulyp.ui.reader.ReaderRegistry
import com.ulyp.ui.util.SearchListener
import javafx.fxml.FXML
import javafx.fxml.Initializable
import javafx.scene.control.Button
import javafx.scene.control.TextField
import javafx.stage.Stage
import org.springframework.beans.factory.annotation.Autowired
import java.net.URL
import java.util.*

class SearchView() : Initializable {
class SearchView : Initializable {

@FXML
lateinit var searchTextField: TextField
@FXML
lateinit var searchApplyButton: Button
@Autowired
lateinit var fileRecordingTabPane: FileRecordingTabPane
@Autowired
lateinit var readerRegistry: ReaderRegistry

var stage: Stage? = null

override fun initialize(url: URL, rb: ResourceBundle?) {
}

fun apply() {
val selectedItem = fileRecordingTabPane.selectionModel.selectedItem as FileRecordingsTab?
/* if (selectedItem != null) {
selectedItem.recordingDataReader.initiateSearch(
PlainTextSearchQuery(searchTextField.text),
SearchListener(selectedItem)
val selectedFileTab = fileRecordingTabPane.selectionModel.selectedItem as FileRecordingsTab?
if (selectedFileTab != null) {
val dataReader = readerRegistry.getByFile(selectedFileTab.name.file)

if (dataReader == null) {
return
}

dataReader.submitReaderJob(
SearchDataReaderJob(PlainTextSearchQuery(searchTextField.text), SearchListener(selectedFileTab))
)
stage?.close()
}*/
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,11 @@ class RecordingListItem(recording: Recording, settings: Settings): StackPane() {
}

fun markHighlighted() {
// this.children.add(RecordingListItemSelectionMark())
method.markHighlighted()
}

fun clearHighlight() {

method.clearHighlight()
}

fun update(recording: Recording) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ class RecordingListItemMethod(private val recording: Recording, settings: Settin
}

private var showThreadName: Boolean = false
val recordingId = recording.id

init {
this.showThreadName = settings.recordingListShowThreads.get()
Expand Down Expand Up @@ -87,4 +86,12 @@ class RecordingListItemMethod(private val recording: Recording, settings: Settin
Style.RECORDING_LIST_ITEM
)
}

fun markHighlighted() {
children.forEach { it.styleClass.add("search-highlighted") }
}

fun clearHighlight() {
children.forEach { it.styleClass.remove("search-highlighted") }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.ulyp.ui.elements.recording.list

import javafx.scene.layout.Region

class RecordingListItemSelectionMark() : Region() {
class RecordingListItemSelectionMark : Region() {
init {
styleClass += "ulyp-recording-list-item-selected"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,12 @@ class RecordingsListView(val settings: Settings) : ListView<RecordingListItem>()
}
fromStateItem.update(recording)
}

fun highlight(recordingId: Int) {
recordings[recordingId]?.markHighlighted()
}

fun clearHighlights() {
recordings.forEach { recordingId, recordingListItem -> recordingListItem.clearHighlight() }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.ulyp.ui.elements.recording.tree
import com.ulyp.core.ProcessMetadata
import java.io.File

class FileRecordingsTabName(private val file: File, private val processMetadata: ProcessMetadata) {
class FileRecordingsTabName(val file: File, val processMetadata: ProcessMetadata) {
override fun toString(): String {
return String.format("%s: %s", file.absolutePath, processMetadata.mainClassName)
}
Expand Down
Loading
Loading