package com.example; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.logging.Level; import java.util.logging.Logger; import javafx.application.Application; import static javafx.application.Application.launch; import javafx.application.Platform; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.concurrent.Task; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.scene.Group; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.chart.PieChart; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.ListView; import javafx.scene.control.ProgressBar; import javafx.scene.control.TitledPane; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.shape.Rectangle; import javafx.stage.Stage; import javafx.stage.StageStyle; public class HTTPClientTest extends Application { private List urlList = new CopyOnWriteArrayList<>(); PieChart chart = new PieChart(); BorderPane controlLayout = new BorderPane(); Label progressText = new Label("Verifying Links.. Pls wait.."); VBox progressBox = new VBox(); ProgressBar bar = new ProgressBar(); ImageView imageView = new ImageView(); Button startButton = new Button("Start"); VBox paneBox = new VBox(); Button chartButton = new Button("View Chart"); @Override public void start(Stage stage) { stage.initStyle(StageStyle.UNDECORATED); Group root = new Group(); Scene scene = new Scene(root, 900, 700); stage.setScene(scene); stage.setTitle("Link Checker"); scene.getStylesheets().add("/resources/style/MyStyle.css"); Rectangle rect = new Rectangle(900, 700); rect.setArcHeight(10.0); rect.setArcWidth(10.0); root.setClip(rect); VBox vb = new VBox(); Button closeButton = new Button(); closeButton.setId("window-close"); closeButton.setText("Close Window"); closeButton.setOnAction(new EventHandler() { @Override public void handle(ActionEvent actionEvent) { Platform.exit(); }}); vb.setSpacing(5); controlLayout.setPrefSize(1000, 800); controlLayout.setId("cLayout"); controlLayout.setStyle("-fx-border-color: black;"); Image image = new Image("resources/images/oraclejava.jpg"); imageView.setImage(image); controlLayout.setCenter(imageView); Task task = new Task() { @Override public Void call() { startButton.setDisable(true); ExecutorService executor = Executors.newFixedThreadPool(5); try { urlList = Files.readAllLines(Paths.get("src/url-list.txt")); } catch (IOException ex) { Logger.getLogger(HTTPClient.class.getName()).log(Level.SEVERE, null, ex); } Results.getInstance().setLatch(new CountDownLatch(urlList.size())); // urlList.forEach(url -> executor.execute(new HTTPClient(url))); updateMessage("Verifying Links .. Please wait.."); for (int i = 0; i < urlList.size(); i++) { executor.execute(new HTTPClient(urlList.get(i))); updateProgress(i, urlList.size() - 1); } updateMessage("Verification Complete.."); try { Results.getInstance().getLatch().await(); } catch (InterruptedException ex) { System.out.println("Interrupted: " + ex.getMessage()); } finally { if (!executor.isShutdown()) { executor.shutdown(); } } return null; } @Override protected void succeeded() { progressBox.getChildren().remove(startButton); progressBox.getChildren().remove(progressText); progressBox.getChildren().remove(bar); controlLayout.getChildren().remove(imageView); double noOfUrls = urlList.size(); double successPortion = 100 *(Results.getInstance().getSucceededURLList().size() / noOfUrls); double brokenPortion = 100 * (Results.getInstance().getFailedURLList().size() / noOfUrls); double incorrectPortion = 100 * (Results.getInstance().getIncorrectURLList().size() / noOfUrls); ObservableList pieChartData = FXCollections.observableArrayList( new PieChart.Data("Incorrect URLs (" + Results.getInstance().getIncorrectURLList().size() + ")", incorrectPortion), new PieChart.Data("Succeeded URLs (" + Results.getInstance().getSucceededURLList().size() + ")", successPortion), new PieChart.Data("Broken URLs (" + Results.getInstance().getFailedURLList().size() + ")", brokenPortion) ); chart.setData(pieChartData); chart.setTitle("Link Analysis"); Button details = new Button(); details.setId("details"); details.setText("Click to see Details"); details.setOnAction((ActionEvent e) -> { details.setDisable(true); chartButton.setDisable(false); ListView failedlistView = new ListView(); ListView incorrectlistView = new ListView(); ListView succeededlistView = new ListView(); List failedURLList = Results.getInstance().getFailedURLList(); List incorrectURLList = Results.getInstance().getIncorrectURLList(); List succeededURLList = Results.getInstance().getSucceededURLList(); ObservableList failedItems = FXCollections.observableList(failedURLList); ObservableList incorrectItems = FXCollections.observableList(incorrectURLList); ObservableList succeededItems = FXCollections.observableList(succeededURLList); final int ROW_HEIGHT = 43; final int ROW_WIDTH = 500; failedlistView.setItems(failedItems); failedlistView.setPrefHeight(failedItems.size() * ROW_HEIGHT); failedlistView.setMaxWidth(ROW_WIDTH); incorrectlistView.setItems(incorrectItems); incorrectlistView.setPrefHeight(incorrectItems.size() * ROW_HEIGHT); incorrectlistView.setMaxWidth(ROW_WIDTH); succeededlistView.setItems(succeededItems); succeededlistView.setPrefHeight(succeededItems.size() * ROW_HEIGHT); succeededlistView.setMaxWidth(ROW_WIDTH); TitledPane t1 = new TitledPane("Failed", failedlistView); TitledPane t2 = new TitledPane("Incorrect", incorrectlistView); TitledPane t3 = new TitledPane("Succeeded", succeededlistView); int paneSize = paneBox.getChildren().size(); if (paneSize > 0) { Node node1 = paneBox.getChildren().get(0); Node node2 = paneBox.getChildren().get(1); Node node3 = paneBox.getChildren().get(2); paneBox.getChildren().remove(node1); paneBox.getChildren().remove(node2); paneBox.getChildren().remove(node3); } paneBox.getChildren().addAll(t1, t2, t3); paneBox.setMaxWidth(ROW_WIDTH); progressBox.getChildren().remove(chart); progressBox.getChildren().remove(paneBox); progressBox.getChildren().add(0, paneBox); }); chartButton.setId("chart-button"); chartButton.setOnAction((ActionEvent event) -> { progressBox.getChildren().remove(paneBox); progressBox.getChildren().add(0, chart); chartButton.setDisable(true); details.setDisable(false); }); chartButton.setDisable(true); HBox hBox = new HBox(details,chartButton, closeButton); hBox.setSpacing(50); progressBox.getChildren().addAll(chart, hBox); progressBox.setPadding(new Insets(-80, -40, 40, 30)); } };// Close the Task progressBox.setSpacing(60); progressBox.getChildren().addAll(progressText); controlLayout.setBottom(progressBox); Label header = new Label("JavaFX Based Link Checker"); header.setId("header"); controlLayout.setTop(header); bar.setPrefSize(950, 25); bar.progressProperty().bind(task.progressProperty()); progressText.setId("pText"); progressText.textProperty().bind(task.messageProperty()); Thread thread1 = new Thread(task); thread1.setName("thread2"); startButton.setId("startButton"); startButton.setOnAction((ActionEvent actionEvent) -> { progressBox.getChildren().addAll(bar); thread1.start(); }); progressBox.getChildren().addAll(startButton); vb.getChildren().addAll((controlLayout)); scene.setRoot(vb); stage.show(); } public static void main(String[] args) { launch(args); } }