TextAnalysisController.java
package com.kapil.verbametrics.ui.controller;
import com.kapil.verbametrics.domain.ReadabilityMetrics;
import com.kapil.verbametrics.domain.SentimentScore;
import com.kapil.verbametrics.dto.TextAnalysisRequest;
import com.kapil.verbametrics.dto.TextAnalysisResponse;
import com.kapil.verbametrics.services.BasicTextAnalysisService;
import com.kapil.verbametrics.services.ReadabilityAnalysisService;
import com.kapil.verbametrics.services.SentimentAnalysisService;
import com.kapil.verbametrics.ui.util.GuiConstants;
/**
* Controller class to handle text analysis operations.
*
* @param basicService the basic text analysis service
* @param sentimentService the sentiment analysis service
* @param readabilityService the readability analysis service
*/
public record TextAnalysisController(BasicTextAnalysisService basicService, SentimentAnalysisService sentimentService,
ReadabilityAnalysisService readabilityService) {
/**
* Analyze the given text and return the analysis results.
*
* @param text the text to analyze
* @return the analysis results
* @throws IllegalArgumentException if text is invalid
*/
public AnalysisResult analyze(String text) {
validateInput(text);
TextAnalysisResponse basic = basicService.analyzeText(new TextAnalysisRequest(text));
SentimentScore sentiment = sentimentService.analyzeSentiment(text);
ReadabilityMetrics readability = readabilityService.analyzeReadability(text);
return new AnalysisResult(basic, sentiment, readability);
}
/**
* Validate the input text for analysis.
*
* @param text the text to validate
* @throws IllegalArgumentException if text is invalid
*/
private void validateInput(String text) {
if (text == null || text.isBlank()) {
throw new IllegalArgumentException("Text cannot be null or blank");
}
if (text.length() > GuiConstants.MAX_TEXT_LENGTH) {
throw new IllegalArgumentException("Text too long (max 10,000 characters)");
}
}
/**
* Record to hold the analysis results.
*
* @param basic the basic text analysis response
* @param sentiment the sentiment score
* @param readability the readability metrics
*/
public record AnalysisResult(TextAnalysisResponse basic, SentimentScore sentiment, ReadabilityMetrics readability) {
}
}