initiall commit

This commit is contained in:
Alexander Karpov 2024-11-26 02:32:07 +03:00
commit 768f1bafb5
2743 changed files with 616956 additions and 0 deletions

29
README.md Normal file
View File

@ -0,0 +1,29 @@
## Лабораторная работа #3
![img.png](img.png)
Вариант 665
Разработать приложение на базе JavaServer Faces Framework, которое осуществляет проверку попадания точки в заданную область на координатной плоскости.
Приложение должно включать в себя 2 facelets-шаблона - стартовую страницу и основную страницу приложения, а также набор управляемых бинов (managed beans), реализующих логику на стороне сервера.
Стартовая страница должна содержать следующие элементы:
"Шапку", содержащую ФИО студента, номер группы и номер варианта.
Интерактивные часы, показывающие текущие дату и время, обновляющиеся раз в 11 секунд.
Ссылку, позволяющую перейти на основную страницу приложения.
Основная страница приложения должна содержать следующие элементы:
Набор компонентов для задания координат точки и радиуса области в соответствии с вариантом задания. Может потребоваться использование дополнительных библиотек компонентов - ICEfaces (префикс "ace") и PrimeFaces (префикс "p"). Если компонент допускает ввод заведомо некорректных данных (таких, например, как буквы в координатах точки или отрицательный радиус), то приложение должно осуществлять их валидацию.
Динамически обновляемую картинку, изображающую область на координатной плоскости в соответствии с номером варианта и точки, координаты которых были заданы пользователем. Клик по картинке должен инициировать сценарий, осуществляющий определение координат новой точки и отправку их на сервер для проверки её попадания в область. Цвет точек должен зависить от факта попадания / непопадания в область. Смена радиуса также должна инициировать перерисовку картинки.
Таблицу со списком результатов предыдущих проверок.
Ссылку, позволяющую вернуться на стартовую страницу.
Дополнительные требования к приложению:
Все результаты проверки должны сохраняться в базе данных под управлением СУБД PostgreSQL.
Для доступа к БД необходимо использовать протокол JDBC без каких-либо дополнительных библиотек.
Для управления списком результатов должен использоваться Application-scoped Managed Bean.
Конфигурация управляемых бинов должна быть задана с помощью аннотаций.
Правила навигации между страницами приложения должны быть заданы в отдельном конфигурационном файле.

BIN
img.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@ -0,0 +1,9 @@
CREATE TABLE IF NOT EXISTS points (
id SERIAL PRIMARY KEY,
x DOUBLE PRECISION NOT NULL,
y DOUBLE PRECISION NOT NULL,
r DOUBLE PRECISION NOT NULL,
hit BOOLEAN NOT NULL,
timestamp BIGINT NOT NULL,
execution_time BIGINT NOT NULL
);

View File

@ -0,0 +1 @@
DROP TABLE IF EXISTS points;

67
pom.xml Normal file
View File

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?>
<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>
<groupId>ru.akarpov</groupId>
<artifactId>web-3</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jsf.version>3.0.0</jsf.version>
<primefaces.version>12.0.0</primefaces.version>
</properties>
<dependencies>
<!-- JSF API and Implementation -->
<dependency>
<groupId>jakarta.faces</groupId>
<artifactId>jakarta.faces-api</artifactId>
<version>${jsf.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>jakarta.faces</artifactId>
<version>${jsf.version}</version>
</dependency>
<!-- PrimeFaces -->
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>${primefaces.version}</version>
<classifier>jakarta</classifier>
</dependency>
<!-- PostgreSQL JDBC Driver -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.6.0</version>
</dependency>
<!-- Jakarta EE Web API -->
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-web-api</artifactId>
<version>9.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,104 @@
package ru.akarpov.web3.beans;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Named;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@Named
@ApplicationScoped
public class BinaryClockBean {
private static final DateTimeFormatter dateFormatter =
DateTimeFormatter.ofPattern("EEEE, MMMM d, yyyy");
public String getCurrentDate() {
return LocalDateTime.now().format(dateFormatter);
}
public String[] getHourBinary() {
return getBinary(getHours(), 5);
}
public String[] getMinuteBinary() {
return getBinary(getMinutes(), 6);
}
public String[] getSecondBinary() {
return getBinary(getSeconds(), 6);
}
public int[] getHourBitValues() {
return getBitValues(5);
}
public int[] getMinuteBitValues() {
return getBitValues(6);
}
public int[] getSecondBitValues() {
return getBitValues(6);
}
public int getHours() {
return LocalDateTime.now().getHour();
}
public int getMinutes() {
return LocalDateTime.now().getMinute();
}
public int getSeconds() {
return LocalDateTime.now().getSecond();
}
// Methods for Day, Month, Year in binary
public String[] getDayBinary() {
return getBinary(getDay(), 5);
}
public String[] getMonthBinary() {
return getBinary(getMonth(), 4);
}
public String[] getYearBinary() {
return getBinary(getYear() % 100, 7);
}
public int[] getDayBitValues() {
return getBitValues(5);
}
public int[] getMonthBitValues() {
return getBitValues(4);
}
public int[] getYearBitValues() {
return getBitValues(7);
}
public int getDay() {
return LocalDateTime.now().getDayOfMonth();
}
public int getMonth() {
return LocalDateTime.now().getMonthValue();
}
public int getYear() {
return LocalDateTime.now().getYear();
}
private String[] getBinary(int value, int length) {
String binary = String.format("%" + length + "s",
Integer.toBinaryString(value)).replace(' ', '0');
return binary.split("");
}
private int[] getBitValues(int length) {
int[] bitValues = new int[length];
for (int i = 0; i < length; i++) {
bitValues[i] = (int) Math.pow(2, length - i - 1);
}
return bitValues;
}
}

View File

@ -0,0 +1,69 @@
package ru.akarpov.web3.beans;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.annotation.PostConstruct;
import jakarta.inject.Named;
import ru.akarpov.web3.data.DatabaseHandler;
import ru.akarpov.web3.model.Point;
import ru.akarpov.web3.util.AreaChecker;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Named
@ApplicationScoped
public class PointBean implements Serializable {
private double x;
private double y;
private double r = 2.0;
private List<Point> points;
private final DatabaseHandler dbHandler = new DatabaseHandler();
@PostConstruct
public void init() {
points = dbHandler.loadPoints();
if (points == null) {
points = new ArrayList<>();
}
}
public void addPoint() {
long startTime = System.nanoTime();
boolean hit = AreaChecker.checkHit(x, y, r);
long executionTime = (System.nanoTime() - startTime) / 1000000; // Convert to milliseconds
Point point = new Point(x, y, r, hit, LocalDateTime.now(), executionTime);
points.add(point);
dbHandler.savePoint(point);
}
public void setX(double x) {
this.x = x;
}
public double getX() {
return x;
}
public void setY(double y) {
this.y = y;
}
public double getY() {
return y;
}
public void setR(double r) {
this.r = r;
}
public double getR() {
return r;
}
public List<Point> getPoints() {
return points;
}
}

View File

@ -0,0 +1,87 @@
package ru.akarpov.web3.data;
import ru.akarpov.web3.model.Point;
import java.sql.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
public class DatabaseHandler {
private static final String URL = "jdbc:postgresql://localhost:5432/web-3";
private static final String USER = "postgres";
private static final String PASSWORD = "postgres";
public DatabaseHandler() {
initTable();
}
private void initTable() {
String sql = """
CREATE TABLE IF NOT EXISTS points (
id SERIAL PRIMARY KEY,
x DOUBLE PRECISION NOT NULL,
y DOUBLE PRECISION NOT NULL,
r DOUBLE PRECISION NOT NULL,
hit BOOLEAN NOT NULL,
timestamp TIMESTAMP NOT NULL,
execution_time BIGINT NOT NULL
)""";
try (Connection conn = getConnection();
Statement stmt = conn.createStatement()) {
stmt.execute(sql);
} catch (SQLException e) {
throw new RuntimeException("Could not initialize table", e);
}
}
public void savePoint(Point point) {
String sql = "INSERT INTO points (x, y, r, hit, timestamp, execution_time) VALUES (?, ?, ?, ?, ?, ?)";
try (Connection conn = getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setDouble(1, point.getX());
pstmt.setDouble(2, point.getY());
pstmt.setDouble(3, point.getR());
pstmt.setBoolean(4, point.isHit());
pstmt.setObject(5, point.getTimestamp());
pstmt.setLong(6, point.getExecutionTime());
pstmt.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException("Could not save point", e);
}
}
public List<Point> loadPoints() {
List<Point> points = new ArrayList<>();
String sql = "SELECT * FROM points ORDER BY timestamp DESC";
try (Connection conn = getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
Point point = new Point(
rs.getDouble("x"),
rs.getDouble("y"),
rs.getDouble("r"),
rs.getBoolean("hit"),
rs.getObject("timestamp", LocalDateTime.class),
rs.getLong("execution_time")
);
points.add(point);
}
} catch (SQLException e) {
throw new RuntimeException("Could not load points", e);
}
return points;
}
private Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASSWORD);
}
}

View File

@ -0,0 +1,50 @@
package ru.akarpov.web3.model;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Point implements Serializable {
private double x;
private double y;
private double r;
private boolean hit;
private LocalDateTime timestamp;
private long executionTime;
private static final DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public Point() {}
public Point(double x, double y, double r, boolean hit, LocalDateTime timestamp, long executionTime) {
this.x = x;
this.y = y;
this.r = r;
this.hit = hit;
this.timestamp = timestamp;
this.executionTime = executionTime;
}
public double getX() { return x; }
public void setX(double x) { this.x = x; }
public double getY() { return y; }
public void setY(double y) { this.y = y; }
public double getR() { return r; }
public void setR(double r) { this.r = r; }
public boolean isHit() { return hit; }
public void setHit(boolean hit) { this.hit = hit; }
public LocalDateTime getTimestamp() { return timestamp; }
public void setTimestamp(LocalDateTime timestamp) { this.timestamp = timestamp; }
// For display purposes
public String getFormattedTimestamp() {
return timestamp != null ? timestamp.format(formatter) : "";
}
public long getExecutionTime() { return executionTime; }
public void setExecutionTime(long executionTime) { this.executionTime = executionTime; }
}

View File

@ -0,0 +1,20 @@
package ru.akarpov.web3.util;
public class AreaChecker {
public static boolean checkHit(double x, double y, double r) {
// Triangle in -x, -y quadrant
if (x <= 0 && y <= 0) {
return x >= -r/2 && y >= -r && y >= -2*x - r;
}
// Square in -x, +y quadrant
if (x <= 0 && y >= 0) {
return x >= -r/2 && y <= r;
}
// Quarter circle in +x, -y quadrant
if (x >= 0 && y <= 0) {
return x*x + y*y <= r*r;
}
// Nothing in +x, +y quadrant
return false;
}
}

View File

@ -0,0 +1,3 @@
db.url=jdbc:postgresql://localhost:5432/web-3
db.user=postgres
db.password=postgres

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<faces-config
xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-facesconfig_3_0.xsd"
version="3.0">
<navigation-rule>
<from-view-id>/index.xhtml</from-view-id>
<navigation-case>
<from-outcome>main</from-outcome>
<to-view-id>/main.xhtml</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/main.xhtml</from-view-id>
<navigation-case>
<from-outcome>index</from-outcome>
<to-view-id>/index.xhtml</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
</faces-config>

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>jakarta.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.xhtml</welcome-file>
</welcome-file-list>
<error-page>
<error-code>404</error-code>
<location>/index.xhtml</location>
</error-page>
<context-param>
<param-name>jakarta.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
</web-app>

124
src/main/webapp/index.xhtml Normal file
View File

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>Start Page</title>
<h:outputStylesheet name="css/styles.css"/>
</h:head>
<h:body>
<div class="header">
<h1>Web лаба 3</h1>
<p>сделал: Карпов Александр Дмитриевич</p>
<p>Группа: P3213</p>
<p>Вариант: 665</p>
</div>
<div class="content">
<h:form id="clockForm">
<div class="clock-section">
<div class="date-display">
#{binaryClockBean.currentDate}
</div>
<div class="clock-container">
<!-- Time Columns -->
<!-- Hour Column -->
<div class="clock-column">
<div class="clock-label">Hours</div>
<div class="clock-bits">
<ui:repeat value="#{binaryClockBean.hourBinary}" var="bit" varStatus="status">
<div class="bit-row">
<div class="bit-value">#{binaryClockBean.hourBitValues[status.index]}</div>
<div class="clock-bit #{bit eq '1' ? 'active' : ''}"/>
</div>
</ui:repeat>
</div>
<div class="decimal-value">#{binaryClockBean.hours}</div>
</div>
<!-- Minute Column -->
<div class="clock-column">
<div class="clock-label">Minutes</div>
<div class="clock-bits">
<ui:repeat value="#{binaryClockBean.minuteBinary}" var="bit" varStatus="status">
<div class="bit-row">
<div class="bit-value">#{binaryClockBean.minuteBitValues[status.index]}</div>
<div class="clock-bit #{bit eq '1' ? 'active' : ''}"/>
</div>
</ui:repeat>
</div>
<div class="decimal-value">#{binaryClockBean.minutes}</div>
</div>
<!-- Second Column -->
<div class="clock-column">
<div class="clock-label">Seconds</div>
<div class="clock-bits">
<ui:repeat value="#{binaryClockBean.secondBinary}" var="bit" varStatus="status">
<div class="bit-row">
<div class="bit-value">#{binaryClockBean.secondBitValues[status.index]}</div>
<div class="clock-bit #{bit eq '1' ? 'active' : ''}"/>
</div>
</ui:repeat>
</div>
<div class="decimal-value">#{binaryClockBean.seconds}</div>
</div>
<!-- Date Columns -->
<!-- Day Column -->
<div class="clock-column">
<div class="clock-label">Day</div>
<div class="clock-bits">
<ui:repeat value="#{binaryClockBean.dayBinary}" var="bit" varStatus="status">
<div class="bit-row">
<div class="bit-value">#{binaryClockBean.dayBitValues[status.index]}</div>
<div class="clock-bit #{bit eq '1' ? 'active' : ''}"/>
</div>
</ui:repeat>
</div>
<div class="decimal-value">#{binaryClockBean.day}</div>
</div>
<!-- Month Column -->
<div class="clock-column">
<div class="clock-label">Month</div>
<div class="clock-bits">
<ui:repeat value="#{binaryClockBean.monthBinary}" var="bit" varStatus="status">
<div class="bit-row">
<div class="bit-value">#{binaryClockBean.monthBitValues[status.index]}</div>
<div class="clock-bit #{bit eq '1' ? 'active' : ''}"/>
</div>
</ui:repeat>
</div>
<div class="decimal-value">#{binaryClockBean.month}</div>
</div>
<!-- Year Column -->
<div class="clock-column">
<div class="clock-label">Year</div>
<div class="clock-bits">
<ui:repeat value="#{binaryClockBean.yearBinary}" var="bit" varStatus="status">
<div class="bit-row">
<div class="bit-value">#{binaryClockBean.yearBitValues[status.index]}</div>
<div class="clock-bit #{bit eq '1' ? 'active' : ''}"/>
</div>
</ui:repeat>
</div>
<div class="decimal-value">#{binaryClockBean.year % 100}</div>
</div>
</div>
</div>
<p:poll interval="11" update="clockForm"/>
</h:form>
<div class="navigation">
<h:form>
<h:commandButton value="На главную" action="main?faces-redirect=true" styleClass="nav-button"/>
</h:form>
</div>
</div>
</h:body>
</html>

103
src/main/webapp/main.xhtml Normal file
View File

@ -0,0 +1,103 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<ui:composition template="/templates/base.xhtml">
<ui:define name="content">
<h:form id="mainForm">
<p:remoteCommand name="plotPoint"
action="#{pointBean.addPoint}"
update="mainForm"
oncomplete="handleAjaxComplete()"/>
<div class="main-container">
<div class="input-section">
<div class="graph-and-inputs">
<div class="graph-container">
<canvas id="graph" width="400" height="400"></canvas>
</div>
<div class="controls-container">
<div class="input-group">
<label>X:</label>
<div class="x-buttons">
<ui:repeat value="#{[-3,-2,-1,0,1,2,3,4,5]}" var="xValue">
<p:commandButton value="#{xValue}"
action="#{pointBean.addPoint}"
update="mainForm"
oncomplete="handleAjaxComplete()"
styleClass="x-button">
<f:setPropertyActionListener value="#{xValue}"
target="#{pointBean.x}"/>
</p:commandButton>
</ui:repeat>
</div>
</div>
<div class="input-group">
<label>Y:</label>
<p:inputText id="yInput" value="#{pointBean.y}" required="true"
validatorMessage="Y must be between -5 and 3">
<f:validateDoubleRange minimum="-5" maximum="3"/>
</p:inputText>
<p:message for="yInput"/>
</div>
<div class="input-group">
<label>R:</label>
<p:inputText id="rInput" value="#{pointBean.r}" required="true"
validatorMessage="R must be between 1 and 4">
<f:validateDoubleRange minimum="1" maximum="4"/>
<p:ajax event="change" oncomplete="handleAjaxComplete()"/>
</p:inputText>
<p:message for="rInput"/>
</div>
<h:inputHidden id="xHidden" value="#{pointBean.x}"/>
<h:inputHidden id="yHidden" value="#{pointBean.y}"/>
</div>
</div>
<div class="results-container">
<p:dataTable id="resultsTable" value="#{pointBean.points}" var="point"
styleClass="results-table">
<p:column headerText="X">
<h:outputText value="#{point.x}"/>
</p:column>
<p:column headerText="Y">
<h:outputText value="#{point.y}"/>
</p:column>
<p:column headerText="R">
<h:outputText value="#{point.r}"/>
</p:column>
<p:column headerText="Hit">
<h:outputText value="#{point.hit ? 'Yes' : 'No'}"/>
</p:column>
<p:column headerText="Time">
<h:outputText value="#{point.formattedTimestamp}"/>
</p:column>
<p:column headerText="Execution Time (ms)">
<h:outputText value="#{point.executionTime}"/>
</p:column>
</p:dataTable>
</div>
</div>
</div>
</h:form>
<div class="navigation">
<h:form>
<h:commandButton value="Назад" action="index?faces-redirect=true" styleClass="nav-button"/>
</h:form>
</div>
</ui:define>
<ui:define name="scripts">
<h:outputScript name="js/canvas.js"/>
</ui:define>
</ui:composition>
</html>

View File

@ -0,0 +1,181 @@
/* General Styles */
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
background-color: #f0f0f0;
}
.header {
background-color: #333;
color: white;
padding: 20px;
text-align: center;
}
.content {
max-width: 1200px;
margin: 20px auto;
padding: 20px;
}
/* Clock Styles */
.clock-section {
background: #1a1a1a;
padding: 2rem;
border-radius: 1rem;
margin-bottom: 2rem;
}
.date-display {
text-align: center;
color: #30ff30;
font-size: 1.5rem;
margin-bottom: 1.5rem;
}
.clock-container {
display: flex;
justify-content: center;
gap: 3rem;
padding: 1rem;
}
.clock-column {
display: flex;
flex-direction: column;
align-items: center;
gap: 0.5rem;
}
.clock-label {
color: #30ff30;
font-size: 1.2rem;
margin-bottom: 0.5rem;
}
.bit-values {
color: #888;
font-family: monospace;
font-size: 0.8rem;
letter-spacing: 0.3rem;
}
.clock-bit {
width: 2rem;
height: 2rem;
border: 2px solid #30ff30;
border-radius: 50%;
margin: 0.25rem;
transition: all 0.3s ease;
}
.clock-bit.active {
background: #30ff30;
box-shadow: 0 0 10px #30ff30;
}
.decimal-value {
color: #30ff30;
font-size: 1.2rem;
margin-top: 0.5rem;
}
/* Main Page Styles */
.main-container {
background: white;
padding: 2rem;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.input-section {
display: flex;
flex-direction: column;
gap: 2rem;
}
.graph-and-inputs {
display: flex;
gap: 2rem;
align-items: flex-start;
}
.graph-container {
flex: 0 0 400px;
background: #f8f8f8;
padding: 1rem;
border-radius: 8px;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
.controls-container {
flex: 1;
display: flex;
flex-direction: column;
gap: 1.5rem;
}
.input-group {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.input-group label {
font-weight: bold;
color: #333;
}
.x-buttons {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 0.5rem;
max-width: 300px;
}
.x-button {
width: 100% !important;
margin: 0 !important;
}
.coordinate-input {
padding: 0.5rem;
border: 1px solid #ddd;
border-radius: 4px;
width: 200px;
}
.submit-button {
width: 200px;
margin-top: 1rem !important;
}
.results-container {
margin-top: 2rem;
}
.results-table {
width: 100%;
}
/* Navigation */
.navigation {
margin-top: 2rem;
text-align: center;
}
.nav-button {
padding: 10px 20px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 1rem;
text-decoration: none;
}
.nav-button:hover {
background-color: #45a049;
}

View File

@ -0,0 +1,178 @@
// Define handleAjaxComplete in the global scope first
window.handleAjaxComplete = function() {
if (typeof canvasManager !== 'undefined') {
canvasManager.initCanvas();
}
};
// Canvas manager object
const canvasManager = {
canvas: null,
ctx: null,
CANVAS_WIDTH: 400,
CANVAS_HEIGHT: 400,
getElement: function(id) {
return document.getElementById('mainForm:' + id);
},
initCanvas: function() {
this.canvas = document.getElementById('graph');
if (this.canvas) {
this.ctx = this.canvas.getContext('2d');
this.canvas.addEventListener('click', this.handleCanvasClick.bind(this));
this.updateGraph();
}
},
handleCanvasClick: function(event) {
if (!this.canvas || !this.ctx) return;
const rInput = this.getElement('rInput');
if (!rInput) return;
const r = parseFloat(rInput.value);
if (!r || r < 1 || r > 4) {
alert('Please set a valid R value (1-4) first');
return;
}
const rect = this.canvas.getBoundingClientRect();
const x = event.clientX - rect.left;
const y = event.clientY - rect.top;
const center = this.CANVAS_WIDTH / 2;
const scale = this.CANVAS_WIDTH / 3 / r;
const graphX = ((x - center) / scale).toFixed(2);
const graphY = ((center - y) / scale).toFixed(2);
this.getElement('xHidden').value = graphX;
this.getElement('yHidden').value = graphY;
plotPoint();
},
updateGraph: function() {
if (!this.canvas || !this.ctx) return;
const rInput = this.getElement('rInput');
if (!rInput) return;
const r = parseFloat(rInput.value);
if (!r || r < 1 || r > 4) return;
this.ctx.clearRect(0, 0, this.CANVAS_WIDTH, this.CANVAS_HEIGHT);
this.drawGrid(r);
this.drawAreas(r);
this.drawPoints();
},
drawGrid: function(r) {
const center = this.CANVAS_WIDTH / 2;
const scale = this.CANVAS_WIDTH / 3 / r;
this.ctx.beginPath();
this.ctx.moveTo(0, center);
this.ctx.lineTo(this.CANVAS_WIDTH, center);
this.ctx.moveTo(center, 0);
this.ctx.lineTo(center, this.CANVAS_HEIGHT);
this.ctx.strokeStyle = 'black';
this.ctx.stroke();
this.ctx.font = '12px Arial';
this.ctx.textAlign = 'center';
this.ctx.textBaseline = 'middle';
[-r, -r/2, r/2, r].forEach(value => {
const x = center + value * scale;
const y = center - value * scale;
this.ctx.beginPath();
this.ctx.moveTo(x, center - 5);
this.ctx.lineTo(x, center + 5);
this.ctx.moveTo(center - 5, y);
this.ctx.lineTo(center + 5, y);
this.ctx.stroke();
this.ctx.fillText(value.toString(), x, center + 20);
this.ctx.fillText(value.toString(), center - 20, y);
});
},
drawAreas: function(r) {
const center = this.CANVAS_WIDTH / 2;
const scale = this.CANVAS_WIDTH / 3 / r;
this.ctx.fillStyle = 'rgba(100, 149, 237, 0.5)';
// Triangle in -x, -y quadrant
this.ctx.beginPath();
this.ctx.moveTo(center, center);
this.ctx.lineTo(center - r/2 * scale, center);
this.ctx.lineTo(center, center + r * scale);
this.ctx.closePath();
this.ctx.fill();
// Square in -x, +y quadrant
this.ctx.fillRect(center - r/2 * scale, center - r * scale, r/2 * scale, r * scale);
// Quarter circle in +x, -y quadrant
this.ctx.beginPath();
this.ctx.moveTo(center, center);
this.ctx.arc(center, center, r * scale, 0, Math.PI/2, false);
this.ctx.closePath();
this.ctx.fill();
},
drawPoints: function() {
const rInput = this.getElement('rInput');
if (!rInput) return;
const r = parseFloat(rInput.value);
if (!r) return;
const center = this.CANVAS_WIDTH / 2;
const scale = this.CANVAS_WIDTH / 3 / r;
// Updated selector to match PrimeFaces table
const table = document.querySelector('[id$="resultsTable"]');
if (!table) return;
const rows = table.querySelectorAll('tbody tr');
rows.forEach(row => {
const cells = row.cells;
// Skip if we don't have enough cells
if (!cells || cells.length < 4) return;
try {
const x = parseFloat(cells[0].textContent.trim());
const y = parseFloat(cells[1].textContent.trim());
const hit = cells[3].textContent.trim() === 'Yes';
// Skip if we couldn't parse the coordinates
if (isNaN(x) || isNaN(y)) return;
// Convert graph coordinates to canvas coordinates
const canvasX = center + x * scale;
const canvasY = center - y * scale;
// Draw the point
this.ctx.beginPath();
this.ctx.arc(canvasX, canvasY, 4, 0, 2 * Math.PI);
this.ctx.fillStyle = hit ? 'green' : 'red';
this.ctx.fill();
this.ctx.strokeStyle = 'black';
this.ctx.stroke();
} catch (e) {
console.error('Error drawing point:', e);
}
});
}
};
// Initialize when DOM is loaded
document.addEventListener('DOMContentLoaded', function() {
canvasManager.initCanvas();
});

View File

@ -0,0 +1,25 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>
<ui:insert name="title">Web лаба 3</ui:insert>
</title>
<h:outputStylesheet name="css/styles.css"/>
</h:head>
<h:body>
<div class="header">
<h1>Web лаба 3</h1>
<p>сделал: Карпов Александр Дмитриевич</p>
<p>Группа: P3213</p>
<p>Вариант: 665</p>
</div>
<div class="content">
<ui:insert name="content">а где</ui:insert>
</div>
<ui:insert name="scripts"/>
</h:body>
</html>

View File

@ -0,0 +1,3 @@
db.url=jdbc:postgresql://localhost:5432/web-3
db.user=postgres
db.password=postgres

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,3 @@
artifactId=web-3
groupId=ru.akarpov
version=1.0-SNAPSHOT

View File

@ -0,0 +1,5 @@
ru/akarpov/web3/model/Point.class
ru/akarpov/web3/beans/PointBean.class
ru/akarpov/web3/util/AreaChecker.class
ru/akarpov/web3/data/DatabaseHandler.class
ru/akarpov/web3/beans/BinaryClockBean.class

View File

@ -0,0 +1,5 @@
/home/sanspie/Projects/web-3/src/main/java/ru/akarpov/web3/beans/BinaryClockBean.java
/home/sanspie/Projects/web-3/src/main/java/ru/akarpov/web3/beans/PointBean.java
/home/sanspie/Projects/web-3/src/main/java/ru/akarpov/web3/data/DatabaseHandler.java
/home/sanspie/Projects/web-3/src/main/java/ru/akarpov/web3/model/Point.java
/home/sanspie/Projects/web-3/src/main/java/ru/akarpov/web3/util/AreaChecker.java

Binary file not shown.

View File

@ -0,0 +1,3 @@
db.url=jdbc:postgresql://localhost:5432/web-3
db.user=postgres
db.password=postgres

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<faces-config
xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-facesconfig_3_0.xsd"
version="3.0">
<navigation-rule>
<from-view-id>/index.xhtml</from-view-id>
<navigation-case>
<from-outcome>main</from-outcome>
<to-view-id>/main.xhtml</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/main.xhtml</from-view-id>
<navigation-case>
<from-outcome>index</from-outcome>
<to-view-id>/index.xhtml</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
</faces-config>

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>jakarta.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.xhtml</welcome-file>
</welcome-file-list>
<error-page>
<error-code>404</error-code>
<location>/index.xhtml</location>
</error-page>
<context-param>
<param-name>jakarta.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
</web-app>

View File

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>Start Page</title>
<h:outputStylesheet name="css/styles.css"/>
</h:head>
<h:body>
<div class="header">
<h1>Web лаба 3</h1>
<p>сделал: Карпов Александр Дмитриевич</p>
<p>Группа: P3213</p>
<p>Вариант: 665</p>
</div>
<div class="content">
<h:form id="clockForm">
<div class="clock-section">
<div class="date-display">
#{binaryClockBean.currentDate}
</div>
<div class="clock-container">
<!-- Time Columns -->
<!-- Hour Column -->
<div class="clock-column">
<div class="clock-label">Hours</div>
<div class="clock-bits">
<ui:repeat value="#{binaryClockBean.hourBinary}" var="bit" varStatus="status">
<div class="bit-row">
<div class="bit-value">#{binaryClockBean.hourBitValues[status.index]}</div>
<div class="clock-bit #{bit eq '1' ? 'active' : ''}"/>
</div>
</ui:repeat>
</div>
<div class="decimal-value">#{binaryClockBean.hours}</div>
</div>
<!-- Minute Column -->
<div class="clock-column">
<div class="clock-label">Minutes</div>
<div class="clock-bits">
<ui:repeat value="#{binaryClockBean.minuteBinary}" var="bit" varStatus="status">
<div class="bit-row">
<div class="bit-value">#{binaryClockBean.minuteBitValues[status.index]}</div>
<div class="clock-bit #{bit eq '1' ? 'active' : ''}"/>
</div>
</ui:repeat>
</div>
<div class="decimal-value">#{binaryClockBean.minutes}</div>
</div>
<!-- Second Column -->
<div class="clock-column">
<div class="clock-label">Seconds</div>
<div class="clock-bits">
<ui:repeat value="#{binaryClockBean.secondBinary}" var="bit" varStatus="status">
<div class="bit-row">
<div class="bit-value">#{binaryClockBean.secondBitValues[status.index]}</div>
<div class="clock-bit #{bit eq '1' ? 'active' : ''}"/>
</div>
</ui:repeat>
</div>
<div class="decimal-value">#{binaryClockBean.seconds}</div>
</div>
<!-- Date Columns -->
<!-- Day Column -->
<div class="clock-column">
<div class="clock-label">Day</div>
<div class="clock-bits">
<ui:repeat value="#{binaryClockBean.dayBinary}" var="bit" varStatus="status">
<div class="bit-row">
<div class="bit-value">#{binaryClockBean.dayBitValues[status.index]}</div>
<div class="clock-bit #{bit eq '1' ? 'active' : ''}"/>
</div>
</ui:repeat>
</div>
<div class="decimal-value">#{binaryClockBean.day}</div>
</div>
<!-- Month Column -->
<div class="clock-column">
<div class="clock-label">Month</div>
<div class="clock-bits">
<ui:repeat value="#{binaryClockBean.monthBinary}" var="bit" varStatus="status">
<div class="bit-row">
<div class="bit-value">#{binaryClockBean.monthBitValues[status.index]}</div>
<div class="clock-bit #{bit eq '1' ? 'active' : ''}"/>
</div>
</ui:repeat>
</div>
<div class="decimal-value">#{binaryClockBean.month}</div>
</div>
<!-- Year Column -->
<div class="clock-column">
<div class="clock-label">Year</div>
<div class="clock-bits">
<ui:repeat value="#{binaryClockBean.yearBinary}" var="bit" varStatus="status">
<div class="bit-row">
<div class="bit-value">#{binaryClockBean.yearBitValues[status.index]}</div>
<div class="clock-bit #{bit eq '1' ? 'active' : ''}"/>
</div>
</ui:repeat>
</div>
<div class="decimal-value">#{binaryClockBean.year % 100}</div>
</div>
</div>
</div>
<p:poll interval="11" update="clockForm"/>
</h:form>
<div class="navigation">
<h:form>
<h:commandButton value="На главную" action="main?faces-redirect=true" styleClass="nav-button"/>
</h:form>
</div>
</div>
</h:body>
</html>

View File

@ -0,0 +1,103 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<ui:composition template="/templates/base.xhtml">
<ui:define name="content">
<h:form id="mainForm">
<p:remoteCommand name="plotPoint"
action="#{pointBean.addPoint}"
update="mainForm"
oncomplete="handleAjaxComplete()"/>
<div class="main-container">
<div class="input-section">
<div class="graph-and-inputs">
<div class="graph-container">
<canvas id="graph" width="400" height="400"></canvas>
</div>
<div class="controls-container">
<div class="input-group">
<label>X:</label>
<div class="x-buttons">
<ui:repeat value="#{[-3,-2,-1,0,1,2,3,4,5]}" var="xValue">
<p:commandButton value="#{xValue}"
action="#{pointBean.addPoint}"
update="mainForm"
oncomplete="handleAjaxComplete()"
styleClass="x-button">
<f:setPropertyActionListener value="#{xValue}"
target="#{pointBean.x}"/>
</p:commandButton>
</ui:repeat>
</div>
</div>
<div class="input-group">
<label>Y:</label>
<p:inputText id="yInput" value="#{pointBean.y}" required="true"
validatorMessage="Y must be between -5 and 3">
<f:validateDoubleRange minimum="-5" maximum="3"/>
</p:inputText>
<p:message for="yInput"/>
</div>
<div class="input-group">
<label>R:</label>
<p:inputText id="rInput" value="#{pointBean.r}" required="true"
validatorMessage="R must be between 1 and 4">
<f:validateDoubleRange minimum="1" maximum="4"/>
<p:ajax event="change" oncomplete="handleAjaxComplete()"/>
</p:inputText>
<p:message for="rInput"/>
</div>
<h:inputHidden id="xHidden" value="#{pointBean.x}"/>
<h:inputHidden id="yHidden" value="#{pointBean.y}"/>
</div>
</div>
<div class="results-container">
<p:dataTable id="resultsTable" value="#{pointBean.points}" var="point"
styleClass="results-table">
<p:column headerText="X">
<h:outputText value="#{point.x}"/>
</p:column>
<p:column headerText="Y">
<h:outputText value="#{point.y}"/>
</p:column>
<p:column headerText="R">
<h:outputText value="#{point.r}"/>
</p:column>
<p:column headerText="Hit">
<h:outputText value="#{point.hit ? 'Yes' : 'No'}"/>
</p:column>
<p:column headerText="Time">
<h:outputText value="#{point.formattedTimestamp}"/>
</p:column>
<p:column headerText="Execution Time (ms)">
<h:outputText value="#{point.executionTime}"/>
</p:column>
</p:dataTable>
</div>
</div>
</div>
</h:form>
<div class="navigation">
<h:form>
<h:commandButton value="Назад" action="index?faces-redirect=true" styleClass="nav-button"/>
</h:form>
</div>
</ui:define>
<ui:define name="scripts">
<h:outputScript name="js/canvas.js"/>
</ui:define>
</ui:composition>
</html>

View File

@ -0,0 +1,181 @@
/* General Styles */
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
background-color: #f0f0f0;
}
.header {
background-color: #333;
color: white;
padding: 20px;
text-align: center;
}
.content {
max-width: 1200px;
margin: 20px auto;
padding: 20px;
}
/* Clock Styles */
.clock-section {
background: #1a1a1a;
padding: 2rem;
border-radius: 1rem;
margin-bottom: 2rem;
}
.date-display {
text-align: center;
color: #30ff30;
font-size: 1.5rem;
margin-bottom: 1.5rem;
}
.clock-container {
display: flex;
justify-content: center;
gap: 3rem;
padding: 1rem;
}
.clock-column {
display: flex;
flex-direction: column;
align-items: center;
gap: 0.5rem;
}
.clock-label {
color: #30ff30;
font-size: 1.2rem;
margin-bottom: 0.5rem;
}
.bit-values {
color: #888;
font-family: monospace;
font-size: 0.8rem;
letter-spacing: 0.3rem;
}
.clock-bit {
width: 2rem;
height: 2rem;
border: 2px solid #30ff30;
border-radius: 50%;
margin: 0.25rem;
transition: all 0.3s ease;
}
.clock-bit.active {
background: #30ff30;
box-shadow: 0 0 10px #30ff30;
}
.decimal-value {
color: #30ff30;
font-size: 1.2rem;
margin-top: 0.5rem;
}
/* Main Page Styles */
.main-container {
background: white;
padding: 2rem;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.input-section {
display: flex;
flex-direction: column;
gap: 2rem;
}
.graph-and-inputs {
display: flex;
gap: 2rem;
align-items: flex-start;
}
.graph-container {
flex: 0 0 400px;
background: #f8f8f8;
padding: 1rem;
border-radius: 8px;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
.controls-container {
flex: 1;
display: flex;
flex-direction: column;
gap: 1.5rem;
}
.input-group {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.input-group label {
font-weight: bold;
color: #333;
}
.x-buttons {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 0.5rem;
max-width: 300px;
}
.x-button {
width: 100% !important;
margin: 0 !important;
}
.coordinate-input {
padding: 0.5rem;
border: 1px solid #ddd;
border-radius: 4px;
width: 200px;
}
.submit-button {
width: 200px;
margin-top: 1rem !important;
}
.results-container {
margin-top: 2rem;
}
.results-table {
width: 100%;
}
/* Navigation */
.navigation {
margin-top: 2rem;
text-align: center;
}
.nav-button {
padding: 10px 20px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 1rem;
text-decoration: none;
}
.nav-button:hover {
background-color: #45a049;
}

View File

@ -0,0 +1,178 @@
// Define handleAjaxComplete in the global scope first
window.handleAjaxComplete = function() {
if (typeof canvasManager !== 'undefined') {
canvasManager.initCanvas();
}
};
// Canvas manager object
const canvasManager = {
canvas: null,
ctx: null,
CANVAS_WIDTH: 400,
CANVAS_HEIGHT: 400,
getElement: function(id) {
return document.getElementById('mainForm:' + id);
},
initCanvas: function() {
this.canvas = document.getElementById('graph');
if (this.canvas) {
this.ctx = this.canvas.getContext('2d');
this.canvas.addEventListener('click', this.handleCanvasClick.bind(this));
this.updateGraph();
}
},
handleCanvasClick: function(event) {
if (!this.canvas || !this.ctx) return;
const rInput = this.getElement('rInput');
if (!rInput) return;
const r = parseFloat(rInput.value);
if (!r || r < 1 || r > 4) {
alert('Please set a valid R value (1-4) first');
return;
}
const rect = this.canvas.getBoundingClientRect();
const x = event.clientX - rect.left;
const y = event.clientY - rect.top;
const center = this.CANVAS_WIDTH / 2;
const scale = this.CANVAS_WIDTH / 3 / r;
const graphX = ((x - center) / scale).toFixed(2);
const graphY = ((center - y) / scale).toFixed(2);
this.getElement('xHidden').value = graphX;
this.getElement('yHidden').value = graphY;
plotPoint();
},
updateGraph: function() {
if (!this.canvas || !this.ctx) return;
const rInput = this.getElement('rInput');
if (!rInput) return;
const r = parseFloat(rInput.value);
if (!r || r < 1 || r > 4) return;
this.ctx.clearRect(0, 0, this.CANVAS_WIDTH, this.CANVAS_HEIGHT);
this.drawGrid(r);
this.drawAreas(r);
this.drawPoints();
},
drawGrid: function(r) {
const center = this.CANVAS_WIDTH / 2;
const scale = this.CANVAS_WIDTH / 3 / r;
this.ctx.beginPath();
this.ctx.moveTo(0, center);
this.ctx.lineTo(this.CANVAS_WIDTH, center);
this.ctx.moveTo(center, 0);
this.ctx.lineTo(center, this.CANVAS_HEIGHT);
this.ctx.strokeStyle = 'black';
this.ctx.stroke();
this.ctx.font = '12px Arial';
this.ctx.textAlign = 'center';
this.ctx.textBaseline = 'middle';
[-r, -r/2, r/2, r].forEach(value => {
const x = center + value * scale;
const y = center - value * scale;
this.ctx.beginPath();
this.ctx.moveTo(x, center - 5);
this.ctx.lineTo(x, center + 5);
this.ctx.moveTo(center - 5, y);
this.ctx.lineTo(center + 5, y);
this.ctx.stroke();
this.ctx.fillText(value.toString(), x, center + 20);
this.ctx.fillText(value.toString(), center - 20, y);
});
},
drawAreas: function(r) {
const center = this.CANVAS_WIDTH / 2;
const scale = this.CANVAS_WIDTH / 3 / r;
this.ctx.fillStyle = 'rgba(100, 149, 237, 0.5)';
// Triangle in -x, -y quadrant
this.ctx.beginPath();
this.ctx.moveTo(center, center);
this.ctx.lineTo(center - r/2 * scale, center);
this.ctx.lineTo(center, center + r * scale);
this.ctx.closePath();
this.ctx.fill();
// Square in -x, +y quadrant
this.ctx.fillRect(center - r/2 * scale, center - r * scale, r/2 * scale, r * scale);
// Quarter circle in +x, -y quadrant
this.ctx.beginPath();
this.ctx.moveTo(center, center);
this.ctx.arc(center, center, r * scale, 0, Math.PI/2, false);
this.ctx.closePath();
this.ctx.fill();
},
drawPoints: function() {
const rInput = this.getElement('rInput');
if (!rInput) return;
const r = parseFloat(rInput.value);
if (!r) return;
const center = this.CANVAS_WIDTH / 2;
const scale = this.CANVAS_WIDTH / 3 / r;
// Updated selector to match PrimeFaces table
const table = document.querySelector('[id$="resultsTable"]');
if (!table) return;
const rows = table.querySelectorAll('tbody tr');
rows.forEach(row => {
const cells = row.cells;
// Skip if we don't have enough cells
if (!cells || cells.length < 4) return;
try {
const x = parseFloat(cells[0].textContent.trim());
const y = parseFloat(cells[1].textContent.trim());
const hit = cells[3].textContent.trim() === 'Yes';
// Skip if we couldn't parse the coordinates
if (isNaN(x) || isNaN(y)) return;
// Convert graph coordinates to canvas coordinates
const canvasX = center + x * scale;
const canvasY = center - y * scale;
// Draw the point
this.ctx.beginPath();
this.ctx.arc(canvasX, canvasY, 4, 0, 2 * Math.PI);
this.ctx.fillStyle = hit ? 'green' : 'red';
this.ctx.fill();
this.ctx.strokeStyle = 'black';
this.ctx.stroke();
} catch (e) {
console.error('Error drawing point:', e);
}
});
}
};
// Initialize when DOM is loaded
document.addEventListener('DOMContentLoaded', function() {
canvasManager.initCanvas();
});

View File

@ -0,0 +1,25 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>
<ui:insert name="title">Web лаба 3</ui:insert>
</title>
<h:outputStylesheet name="css/styles.css"/>
</h:head>
<h:body>
<div class="header">
<h1>Web лаба 3</h1>
<p>сделал: Карпов Александр Дмитриевич</p>
<p>Группа: P3213</p>
<p>Вариант: 665</p>
</div>
<div class="content">
<ui:insert name="content">а где</ui:insert>
</div>
<ui:insert name="scripts"/>
</h:body>
</html>

33
web-3.iml Normal file
View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<module version="4">
<component name="FacetManager">
<facet type="web" name="Web3">
<configuration>
<descriptors>
<deploymentDescriptor name="web.xml" url="file://$MODULE_DIR$/wildfly/standalone/tmp/vfs/temp/temp86c4d937f34064fc/content-bce011618352438/WEB-INF/web.xml" />
</descriptors>
<webroots>
<root url="file://$MODULE_DIR$/wildfly/standalone/tmp/vfs/temp/temp86c4d937f34064fc/content-bce011618352438" relative="/" />
</webroots>
<sourceRoots>
<root url="file://$MODULE_DIR$/src/main/java" />
<root url="file://$MODULE_DIR$/src/main/resources" />
</sourceRoots>
</configuration>
</facet>
<facet type="web" name="Web2">
<configuration>
<descriptors>
<deploymentDescriptor name="web.xml" url="file://$MODULE_DIR$/wildfly/standalone/tmp/vfs/temp/temp3b6a013d5a54d32d/content-e17e51188c963cbb/WEB-INF/web.xml" />
</descriptors>
<webroots>
<root url="file://$MODULE_DIR$/wildfly/standalone/tmp/vfs/temp/temp3b6a013d5a54d32d/content-e17e51188c963cbb" relative="/" />
</webroots>
<sourceRoots>
<root url="file://$MODULE_DIR$/src/main/java" />
<root url="file://$MODULE_DIR$/src/main/resources" />
</sourceRoots>
</configuration>
</facet>
</component>
</module>

View File

@ -0,0 +1,4 @@
appclient.xml
532495c876209d571f74d5a3300d22536f9746a1
logging.properties
f23d8fbead4340131038bf8f07af607f9b73134b

View File

@ -0,0 +1,8 @@
README-CLI-JCONSOLE.txt
4170faae58c767cc5b7f82c1aff27184eef5a4a0
README-EJB-JMS.txt
a996dcda2c002b59d2728c263d5f105a8c79c2bd
jboss-cli-client.jar
acd8deaa6b74f761fb74ff0dffe53a0183b9f46f
jboss-client.jar
411c2afa8448065abf23c104160edf00ad01bb58

View File

@ -0,0 +1,106 @@
.jbossclirc
dcd83889155492eb6078e137231699a4f02cc552
add-user.bat
5ecac88c71bb96f0bb623a81b3daf72c7854ab7a
add-user.properties
e14860abc742b3b256685cd0121733a3aaeaed5b
add-user.ps1
3f0f984395185e1ee1684e18daaf71b0288a75cc
add-user.sh
7f2d9924da3e1fc95265afcc1e8af48a257be423
appclient.bat
a014071131d24038fc312a47c1fe1f3d2b6bf20a
appclient.conf
f6448abb8fa09fdf93ee2e9cdd34820c3443fccc
appclient.conf.bat
848ea40a23dc00c5e924a245946994b33a4e47fd
appclient.conf.ps1
84b82401b63782760bee661ed65903e43b678402
appclient.ps1
7f09b3d6124071f3f36bfed8d8d79468cec84717
appclient.sh
412b60d883aaf53eda49c43ed9366a9512693021
common.bat
ead9b9128bf85c1412d21a4da96ee38baaf3bf9b
common.ps1
c592c86ff9bc310cb255a4626ea75e52606127e2
common.sh
ef48be67bf154d62ad36834715e297ec7bfb3a1a
domain.bat
651ad7f14cfea8236c0ddf31349a48de0cc70bfb
domain.conf
9d16c52d5426b19746f33234e2361a3260f683e7
domain.conf.bat
a4acf634a062c87fb3ef2866380a7310c562295b
domain.conf.ps1
2e0b4a55fa57fa9942ce0f912c1a4485da13b50b
domain.ps1
624b8d9d0c78516cbc7747620012a0f296f725f9
domain.sh
b59e40c7d89ae7152669f43f9e31be919c94c883
elytron-tool.bat
2a279a07892f2f177924cb431d2d3fd5a7a0b186
elytron-tool.ps1
d6e55c48a41ffe8b9cffd3f675e7f6b9bb61e34e
elytron-tool.sh
2bf4b2bcbb69498d93e766a0cda78ace217e2e18
installation-manager.bat
1a94bb4b1e80254f81db27d25bf0f37d23aca111
installation-manager.properties
a9443c682329c0b30089dcc0bdaade5abb6f968c
installation-manager.ps1
ed7c3535cf9b08f8b06b6efd2666afb1e3dd7f44
installation-manager.sh
d4015d7070719287b9392d3513b43c82313e8dde
jboss-cli-logging.properties
d2f5e1ee67a12ab2856137af249e19c57d9e7e00
jboss-cli.bat
55d0e127970fad2139c681d7e50e532bc2901f48
jboss-cli.ps1
e5baf2bc003162f0cb4c61e7c65619b03589814e
jboss-cli.sh
2dbf86ae0132fd1b0958640fef9789e4474b2e0e
jboss-cli.xml
e06123048694c6624fc7827ec458dd4447e474f6
jconsole.bat
c3077b2e130c8690f806663aa0d4e93fb0dbe773
jconsole.ps1
7f022379decba2efa2b02faf03cf66b2e5e94eb4
jconsole.sh
d237aca74d0c04026387fc7c0c7896a7bb6d21ed
jdr.bat
5fc483ce9df1f50ee71d953276381265a77ad508
jdr.ps1
1d953c5f1a1f8f589928c96a417d45da76883deb
jdr.sh
916490961d30ce4c34ce78782409ed267bfeefbe
launcher.jar
8984f477b583f9a8a171bfb1d29f98fc9968287f
product.conf
ba237d5eb52965bcbf1d6fa558f1566c0157b22b
standalone.bat
594ba0bcffee68f04f2189ce41258ffdfb616754
standalone.conf
9ea4032accd5bfe61aebe8c7e401ab31a1fbf40e
standalone.conf.bat
85710239019fdb1da6a50b77584261107800519e
standalone.conf.ps1
68e6a7206195e28475302ed2eed238e0c0ab958c
standalone.ps1
6e1f68fef7203212d8df61c2da557471dcd80514
standalone.sh
c5a306e784dc0e13d73780e0925d9e2df71bec38
wildfly-elytron-tool.jar
badaa021e8f2fac88632bcde8c68eea72e4f0b35
wsconsume.bat
0df6b935bd43dc5767d13b9cbbb37c6014dccb66
wsconsume.ps1
d1553e0c54fe247ae3bdd72f3799bb343c898fe4
wsconsume.sh
4a8a87300ea670f7c25c4bd3fd69923bd5c9ebf2
wsprovide.bat
2c548ce81210f684f3dc0f6646bacd7e9156c556
wsprovide.ps1
94798618662f981d21e285067fc5c0f5e46cb708
wsprovide.sh
c6dda8ca7a6c9d49a522f9b15b5bde6b8b2cc5d3

View File

@ -0,0 +1,2 @@
README.md
a503e1f53e876dff2dabbb5e0dfccd4c9b07192f

View File

@ -0,0 +1,6 @@
wildfly-init-debian.sh
fa501ea0a2a20b75eb537c3ba0f56c8be6dbd6a3
wildfly-init-redhat.sh
62b0e3f39cf470646f4ac06a2e9e903f95bb5054
wildfly.conf
c9137d05357cfb2c33feb3b01ae666d254057623

View File

@ -0,0 +1,2 @@
wildfly-service.exe
b62a0082e9780327ff7681b9c05da2d706476e42

View File

@ -0,0 +1,6 @@
service.bat
d849c6b71473cb85d5079cfc5eb2bc6735ed5650
wildfly-mgr.exe
39cd9893df296428257366dce25110f0eff4c07b
wildfly-service.exe
6e4a3a72fb9bd66b6f6755ea3c1fa922a3073453

View File

@ -0,0 +1,8 @@
README
ea7d8cf2c8a88751a1681275d4d7e3191140647d
launch.sh
296ca556f9627ca313528d8e53a400d42241b5e5
wildfly.conf
41f6c8dcfe4fad4aa43f8aed8f1eb78c58ffb71f
wildfly.service
152a4416c489fca0f8b6a4b474fc8f7efd484665

View File

@ -0,0 +1,30 @@
domain-ec2.xml
e96f4a06598c812dae96ae3564aa0b9d9fb7d0fe
standalone-activemq-colocated.xml
5f1570cf40a906228aac7b72ae6516a13b8cb356
standalone-azure-full-ha.xml
016f30a17a8d718917bbd334a2e2020eb2ca280c
standalone-azure-ha.xml
d53551afe579e2b698d1f00bee968c41838b358c
standalone-core-microprofile.xml
5fbd781fee684f74f9d06e9504e087ee117df40d
standalone-core.xml
6e354b6db6b11e5458606da11c85dfe425d48bc7
standalone-ec2-full-ha.xml
68e8eacbcc8fee7ab4a5df643a66980d77e899ee
standalone-ec2-ha.xml
b60e10d467d12b629aaefb323b9da3dab2ea04fe
standalone-genericjms.xml
87b88458623939078129c148d74328cfef6e0cd3
standalone-gossip-full-ha.xml
9d1f0893b328d55a882c277e8be607cd12ff2a83
standalone-gossip-ha.xml
fea615fa07d0914d884af32be1eadb05f5eef35a
standalone-jts.xml
17587b6dece2646dacce5b36fa023b5a2eac324f
standalone-minimalistic.xml
5c218b78a243c0ccd02b0bbce90a946a0981bf8a
standalone-rts.xml
34dc75ebc42e844df9f23be9775d614b1a763b25
standalone-xts.xml
f2861b8fdd8d5654dfdcddc5c6c678deb5e8476a

View File

@ -0,0 +1,2 @@
enable-microprofile.cli
2dd0552bcfc0007fd139808b3fc99fc741f17de1

View File

@ -0,0 +1,56 @@
MIT_CONTRIBUTORS.txt
c40dbd2dbcd064fd5e2e6e48e2c986ed9db9f1f1
apache license 2.0.txt
2b8b815229aa8a61e483fb4ba0588b8b6c491890
bsd 2-clause simplified license.html
257a88e5266e7383d43e66a62b25d14f8e9d5731
bsd 3-clause new or revised license.html
ea037166f736172dfcb91ab34e211b325c787823
common public license 1.0.txt
7cdb9c36e1d419e07f88628cd016c0481796b89e
creative commons attribution 2.5.html
a3f15d06f44729420d7ab2d87ca9bee7cf2820fe
eclipse distribution license, version 1.0.txt
d520e5d0b7b10f2d36f17ba00b7ea38704f3eed7
eclipse public license 1.0.txt
77a188d578cd71a45134542ea192f93064d1ebf1
eclipse public license 2.0.txt
b086d72d0fe9af38418dab524fe76eea3cb1eec3
fsf all permissive license.html
fcf4e258a3d90869c3a2e7fc55154559318b8eb4
gnu general public license v2.0 only, with classpath exception.txt
cef61f92dbf47fb27b16d36a4146ec7df7dced6d
gnu lesser general public license v2.1 only.txt
01a6b4bf79aca9b556822601186afab86e8c4fbf
gnu lesser general public license v2.1 or later.txt
46dee26f31cce329fa13eacb74f8ac5e52723380
gnu lesser general public license v3.0 only.txt
e7d563f52bf5295e6dba1d67ac23e9f6a160fab9
gnu lesser general public license v3.0 or later.txt
e7d563f52bf5295e6dba1d67ac23e9f6a160fab9
gnu library general public license v2 only.txt
44f7289042b71631acac29b2f143330d2da2479e
indiana university extreme lab software license 1.1.1.html
451bc145d38a999eab098ca1e10ef74a5db08654
licenses.css
b4bdad965c7c9487b8390ea9d910df591b62a680
licenses.html
8fe1f76aa075e6092e83ce75aa916cf0c26edfe1
licenses.xml
e0d5b4737ca5ebab305d095575f1c2c0363feaeb
licenses.xsl
bdf6fbb28dce0e2eed2a2bf1a3e4e030f03536b2
mit license.txt
19eff4fc59155a9343582148816eeb9ffb244279
mit-0.html
50ac12745b7d3674089f3dc1cf326ee0365ef249
mozilla public license 2.0.html
c541f06ec7085d6074c6599f38b11ae4a2a31050
wildfly-ee-feature-pack-licenses.html
6c2d8d05967257aec7bbd2071b84dca54dc1cc28
wildfly-ee-feature-pack-licenses.xml
099f289f65f4c8c6e4bcdbfda679159a3c82d5b8
wildfly-feature-pack-licenses.html
97c018e62d71ee84ade52b82ce6ec367d3fb11e8
wildfly-feature-pack-licenses.xml
44445407a62b9ec9c0b5e50ba32a2396eaa5d67f

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,20 @@
application-roles.properties
2339b5b3b5544b9a54b2a17a077a43277f4becac
application-users.properties
0cdb9ca548eca6503a3cb0e4c7ce80f5336a1c82
default-server-logging.properties
f79da20ce3f13ecf153f75c77bf9d9cb7870509d
domain.xml
daaecccdabe0ae4bd03815b2bbae7f922803efb9
host-primary.xml
925039b4ddb39e39840e77ae069ca505c93392d4
host-secondary.xml
a1e167d1161fa1dac7793729144d850514726e9f
host.xml
730c4b5bac2ef744b0127ac57df7e526c5e1ab17
logging.properties
1138aa7e1af0a0a93f0dc8754773b19dcbc7a68e
mgmt-groups.properties
8a5ca3eeb904c2b6f2bc60f12e7cefed4b5d09b0
mgmt-users.properties
b79a69eb57c60d16a626e20256c7531e2e22fe21

View File

@ -0,0 +1,8 @@
LICENSE.txt
58853eb8199b5afe72a73a25fd8cf8c94285174b
README.txt
4e02800d2609dc82e957cfcf5eae12eeb1120349
copyright.txt
165a59628b050f2faa2477a2a62a92aa024ca1e3
jboss-modules.jar
ad33a0ca75c8189ebbfd8eedbb489a1453b96dea

View File

@ -0,0 +1,6 @@
asm-9.7.jar
073d7b3086e14beb604ced229c302feff6449723
asm-util-9.7.jar
c0655519f24d92af2202cb681cd7c1569df6ead6
module.xml
2fdd92766986752fe05bf9e499a5b89fbfed4b5a

View File

@ -0,0 +1,4 @@
hppc-0.8.1.jar
ffc7ba8f289428b9508ab484b8001dea944ae603
module.xml
7ff9b09d68ddb811bca586f99c7e4895fc11cc99

View File

@ -0,0 +1,4 @@
classmate-1.5.1.jar
3fe0bed568c62df5e89f4f174c101eab25345b6c
module.xml
2c2407d2d12a8b2cd853b25ca0592659cf961c23

View File

@ -0,0 +1,4 @@
jackson-annotations-2.17.0.jar
880a742337010da4c851f843d8cac150e22dff9f
module.xml
e4a8dbea35ecf4bdb108eefc4f7a5fefc2bd8ad0

View File

@ -0,0 +1,4 @@
jackson-core-2.17.0.jar
a6e5058ef9720623c517252d17162f845306ff3a
module.xml
68cdc0d521772e10b6bd0ed00f8e9d5d1a8fa58c

View File

@ -0,0 +1,4 @@
jackson-databind-2.17.0.jar
7173e9e1d4bc6d7ca03bc4eeedcd548b8b580b34
module.xml
afae2e2a7304f640bd4c77db1e7013cb48e6fbce

View File

@ -0,0 +1,4 @@
jackson-dataformat-yaml-2.17.0.jar
57a963c6258c49febc11390082d8503f71bb15a9
module.xml
43440d6ca1b0a4d926a413a73f59c4adae389922

View File

@ -0,0 +1,4 @@
jackson-datatype-jdk8-2.17.0.jar
95519a116d909faec29da76cf6b944b4a84c2c26
module.xml
4f672ef5b562b6de8be01280e228d87f3cdab036

View File

@ -0,0 +1,4 @@
jackson-datatype-jsr310-2.17.0.jar
3fab507bba9d477e52ed2302dc3ddbd23cbae339
module.xml
f3e236cbeb6c19474f74c1798dd38dbc66b7a4a6

View File

@ -0,0 +1,8 @@
jackson-jakarta-rs-base-2.17.0.jar
191c316a3951956fb982b7965cea7e142d9fb87e
jackson-jakarta-rs-json-provider-2.17.0.jar
2f86fc40907f018a45c4d5dd2a5ba43b526fa0cb
jackson-module-jakarta-xmlbind-annotations-2.17.0.jar
0e652f73b9c3d897b51336d9e17c2267bb716917
module.xml
68d13970e8c3a97f5e048798554507fd12b72081

View File

@ -0,0 +1,2 @@
module.xml
09257ddbe3ca160f3ccae184177749efb82a72ce

View File

@ -0,0 +1,4 @@
caffeine-3.1.8.jar
24795585df8afaf70a2cd534786904ea5889c047
module.xml
b5d5c01752d3997d117ec900faa1f167a9b1c285

View File

@ -0,0 +1,4 @@
btf-1.2.jar
9e66651022eb86301b348d57e6f59459effc343b
module.xml
25ed39b0eb6131b1b16f5ad02344a2c4a6bce80c

View File

@ -0,0 +1,4 @@
jackson-coreutils-1.8.jar
491a6e1130a180c153df9f2b7aabd7a700282c67
module.xml
edd282e5b4a283be2818d75ca8d9f12147a5f241

View File

@ -0,0 +1,4 @@
json-patch-1.9.jar
0a4c3c97a0f5965dec15795acf40d3fbc897af4b
module.xml
d617d8be6e99f49dbf75754fb3b4568b38237e6b

View File

@ -0,0 +1,4 @@
module.xml
55470daae6c253ebf9e114335255bd209e7a4c1e
msg-simple-1.1.jar
f261263e13dd4cfa93cc6b83f1f58f619097a2c4

View File

@ -0,0 +1,4 @@
module.xml
d614911cd191a7d479ffa4ac976e043eb963a02e
zstd-jni-1.5.6-5.jar
6b0abf5f2e68df5ffac02cba09fc2d84f7ebd631

View File

@ -0,0 +1,4 @@
gson-2.8.9.jar
8a432c1d6825781e21a02db2e2c33c5fde2833b9
module.xml
e9fece80c079e4436e45267429813501f4852b2d

View File

@ -0,0 +1,4 @@
failureaccess-1.0.2.jar
c4a06a64e650562f30b7bf9aaec1bfed43aca12b
module.xml
7d7ad1fd8299119798c90c5915e4993f56711804

View File

@ -0,0 +1,4 @@
guava-33.0.0-jre.jar
161ba27964a62f241533807a46b8711b13c1d94b
module.xml
5b9a85ab34e0fe19c3a3b31f4954ae40db2b600f

View File

@ -0,0 +1,10 @@
module.xml
eca834efdc39015b90e7129b01d7b1fa6ba5d064
perfmark-api-0.23.0.jar
0b813b7539fae6550541da8caafd6add86d4e22f
proto-google-common-protos-2.0.1.jar
20827628ea2b9f69ae22987b2aedb0050e9c470d
protobuf-java-3.25.5.jar
5ae5c9ec39930ae9b5a61b32b93288818ec05ec1
protobuf-java-util-3.25.5.jar
38cc5ce479603e36466feda2a9f1dfdb2210ef00

View File

@ -0,0 +1,4 @@
JavaEWAH-1.2.3.jar
13a27c856e0c8808cee9a64032c58eee11c3adc9
module.xml
cbc42f2e507993437ba185fdd71dd24fc070c32d

View File

@ -0,0 +1,4 @@
h2-2.2.224.jar
7bdade27d8cd197d9b5ce9dc251f41d2edc5f7ad
module.xml
8f9bda63c7655da79d2d54a359bcadc474b66143

View File

@ -0,0 +1,4 @@
asyncutil-0.1.0.jar
440941c382166029a299602e6c9ff5abde1b5143
module.xml
4a7d1e02072bbab6c935aa93fc915c26b7c5feae

View File

@ -0,0 +1,4 @@
azure-storage-8.6.6.jar
49d84b103a4700134ce56d73b4195f18fd226729
module.xml
0c37ed43810e653e80519241466019e2ee2d8f82

View File

@ -0,0 +1,4 @@
module.xml
0d381cde567d8896a94fe44993a10758ed433b49
nimbus-jose-jwt-9.37.3.jar
700f71ffefd60c16bd8ce711a956967ea9071cec

View File

@ -0,0 +1,4 @@
module.xml
29f238d58ebc8744f45165df41858bf9c0ca4782
protoparser-4.0.3.jar
e61ee0b108059d97f43143eb2ee7a1be8059a30e

View File

@ -0,0 +1,2 @@
module.xml
863fd9eefeafd585ab00c7c1d91a8b16c82f7ab9

View File

@ -0,0 +1,4 @@
FastInfoset-2.1.1.jar
650c84348bbcf4461bd24d38e67f7a7ce687de24
module.xml
a18a415193ecb4584702dba76cff75e83b457330

View File

@ -0,0 +1,6 @@
module.xml
4036fdadd18b5ac952d374077e9e8c43ae7deba9
saaj-impl-3.0.0.jar
592e76b886471149217e4090b02e3d36fd702777
stax-ex-2.1.0.jar
33160568d70c01da407f8ba982bacf283d00ad4a

View File

@ -0,0 +1,4 @@
module.xml
c62ca7298e8392d9d3e0405e6ee250e523cb3ac3
pem-keystore-2.4.0.jar
a4ba3c7b740b9dada642e1b219d537bafd8c237c

View File

@ -0,0 +1,4 @@
java-getopt-1.0.13.jar
bb29ac2c2ab8b92945f01706de4b56c97989c6a9
module.xml
5b1ec5d7710dff2dbc3beceda959bcc47ddbec8e

View File

@ -0,0 +1,2 @@
module.xml
7f680a09778318f400ff51232088d954c87c4c6f

View File

@ -0,0 +1,4 @@
jakarta.json-1.1.6.jar
a39aba0ef0a70c3f54a44a2c539a4f11c9bb07e8
module.xml
2abfebbc96fe44e75ccc1d75cb3e3ecd7ba206a2

View File

@ -0,0 +1,8 @@
agroal-api-2.0.jar
9fd418b07a6563b68034688ca7dce74f5b83d233
agroal-narayana-2.0.jar
38261488606baf55ea34b71ce14918ea7a5dac88
agroal-pool-2.0.jar
a299e789a67d04dca63afe03a1778db184c32962
module.xml
9b810fce6660bd1ab7c730f86721e23229dac58e

View File

@ -0,0 +1,4 @@
grpc-api-1.58.0.jar
1f761949cdfd418a5f662e0d22d2c95f60099c0b
module.xml
39c980c6ee79ec175bea6c3786f38e55854f50fd

View File

@ -0,0 +1,8 @@
micrometer-commons-1.12.4.jar
a57f10c78956b38087f97beae66cf14cb8b08d34
micrometer-core-1.12.4.jar
d5b91e2847de7c1213889c532789743eb2f96337
micrometer-registry-otlp-1.12.4.jar
9aa2c330c53bb34994474ea7e4af2ea4bde00071
module.xml
a70e6656b7cf14699801149b23974bfe91e16861

View File

@ -0,0 +1,4 @@
module.xml
564bd5c25de23bf6aae2a283bba4d0ac1646fa00
netty-buffer-4.1.115.Final.jar
d5daf1030e5c36d198caf7562da2441a97ec0df6

View File

@ -0,0 +1,4 @@
module.xml
8cc3fd3ecb95b3a5e2d667b2f868ca59a6b5a768
netty-codec-dns-4.1.115.Final.jar
d39b9866939cbbb8ae3a1af5c1df5ddf93656d47

Some files were not shown because too many files have changed in this diff Show More