import java.util.function.Consumer;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
import org.apache.commons.lang3.StringUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SearchService {
private static final Logger logger = LoggerFactory.getLogger(SearchService.class);
private static final ObjectMapper objectMapper = new ObjectMapper();
private static final OkHttpClient HTTP_CLIENT = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.build();
private static final String SEARCH_API_URL = "https://example.com/search?q=";
public static void main(String[] args) {
Textbox searchBox = new Textbox();
searchBox.setOnInputChanged(debounceSearch);
}
public static void performSearch(String query) {
if (StringUtils.isBlank(query)) {
logger.info("Empty query, skipping search.");
return;
}
String url = SEARCH_API_URL + query;
Request request = new Request.Builder()
.url(url)
.build();
Call call = HTTP_CLIENT.newCall(request);
try {
Response response = call.execute();
ResponseBody responseBody = response.body();
if (response.isSuccessful() && responseBody != null) {
SearchResult result = objectMapper.readValue(responseBody.string(), SearchResult.class);
processSearchResult(result);
} else {
logger.error("Search request failed with status code: {}", response.code());
}
} catch (Exception e) {
logger.error("Search request failed: {}", e.getMessage(), e);
}
}
private static void processSearchResult(SearchResult result) {
// ...
}
public static <T> Consumer<T> debounce(Consumer<T> consumer, int delayInMillis) {
return new Consumer<T>() {
private long lastExecutionTime = System.currentTimeMillis();
@Override
public void accept(T t) {
long currentTime = System.currentTimeMillis();
if (currentTime - lastExecutionTime >= delayInMillis) {
consumer.accept(t);
lastExecutionTime = currentTime;
}
}
};
}
private static class SearchResult {
// ...
}
private static class Textbox {
private Consumer<String> onInputChanged;
public void setOnInputChanged(Consumer<String> onInputChanged) {
this.onInputChanged = onInputChanged;
}
public void handleChange(String input) {
onInputChanged.accept(input);
}
}
}