initiall commit
This commit is contained in:
commit
768f1bafb5
29
README.md
Normal file
29
README.md
Normal 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.
|
||||
Конфигурация управляемых бинов должна быть задана с помощью аннотаций.
|
||||
Правила навигации между страницами приложения должны быть заданы в отдельном конфигурационном файле.
|
9
migrations/V1_01__initial_schema.sql
Normal file
9
migrations/V1_01__initial_schema.sql
Normal 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
|
||||
);
|
1
migrations/V1_01__rollback.sql
Normal file
1
migrations/V1_01__rollback.sql
Normal file
|
@ -0,0 +1 @@
|
|||
DROP TABLE IF EXISTS points;
|
67
pom.xml
Normal file
67
pom.xml
Normal 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>
|
104
src/main/java/ru/akarpov/web3/beans/BinaryClockBean.java
Normal file
104
src/main/java/ru/akarpov/web3/beans/BinaryClockBean.java
Normal 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;
|
||||
}
|
||||
}
|
69
src/main/java/ru/akarpov/web3/beans/PointBean.java
Normal file
69
src/main/java/ru/akarpov/web3/beans/PointBean.java
Normal 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;
|
||||
}
|
||||
}
|
87
src/main/java/ru/akarpov/web3/data/DatabaseHandler.java
Normal file
87
src/main/java/ru/akarpov/web3/data/DatabaseHandler.java
Normal 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);
|
||||
}
|
||||
}
|
50
src/main/java/ru/akarpov/web3/model/Point.java
Normal file
50
src/main/java/ru/akarpov/web3/model/Point.java
Normal 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; }
|
||||
}
|
20
src/main/java/ru/akarpov/web3/util/AreaChecker.java
Normal file
20
src/main/java/ru/akarpov/web3/util/AreaChecker.java
Normal 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;
|
||||
}
|
||||
}
|
3
src/main/resources/db.properties
Normal file
3
src/main/resources/db.properties
Normal file
|
@ -0,0 +1,3 @@
|
|||
db.url=jdbc:postgresql://localhost:5432/web-3
|
||||
db.user=postgres
|
||||
db.password=postgres
|
26
src/main/webapp/WEB-INF/faces-config.xml
Normal file
26
src/main/webapp/WEB-INF/faces-config.xml
Normal 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>
|
30
src/main/webapp/WEB-INF/web.xml
Normal file
30
src/main/webapp/WEB-INF/web.xml
Normal 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
124
src/main/webapp/index.xhtml
Normal 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
103
src/main/webapp/main.xhtml
Normal 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>
|
181
src/main/webapp/resources/css/styles.css
Normal file
181
src/main/webapp/resources/css/styles.css
Normal 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;
|
||||
}
|
178
src/main/webapp/resources/js/canvas.js
Normal file
178
src/main/webapp/resources/js/canvas.js
Normal 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();
|
||||
});
|
25
src/main/webapp/templates/base.xhtml
Normal file
25
src/main/webapp/templates/base.xhtml
Normal 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>
|
3
target/classes/db.properties
Normal file
3
target/classes/db.properties
Normal file
|
@ -0,0 +1,3 @@
|
|||
db.url=jdbc:postgresql://localhost:5432/web-3
|
||||
db.user=postgres
|
||||
db.password=postgres
|
BIN
target/classes/ru/akarpov/web3/beans/BinaryClockBean.class
Normal file
BIN
target/classes/ru/akarpov/web3/beans/BinaryClockBean.class
Normal file
Binary file not shown.
BIN
target/classes/ru/akarpov/web3/beans/PointBean.class
Normal file
BIN
target/classes/ru/akarpov/web3/beans/PointBean.class
Normal file
Binary file not shown.
BIN
target/classes/ru/akarpov/web3/data/DatabaseHandler.class
Normal file
BIN
target/classes/ru/akarpov/web3/data/DatabaseHandler.class
Normal file
Binary file not shown.
BIN
target/classes/ru/akarpov/web3/model/Point.class
Normal file
BIN
target/classes/ru/akarpov/web3/model/Point.class
Normal file
Binary file not shown.
BIN
target/classes/ru/akarpov/web3/util/AreaChecker.class
Normal file
BIN
target/classes/ru/akarpov/web3/util/AreaChecker.class
Normal file
Binary file not shown.
3
target/maven-archiver/pom.properties
Normal file
3
target/maven-archiver/pom.properties
Normal file
|
@ -0,0 +1,3 @@
|
|||
artifactId=web-3
|
||||
groupId=ru.akarpov
|
||||
version=1.0-SNAPSHOT
|
|
@ -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
|
|
@ -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
|
BIN
target/web-3-1.0-SNAPSHOT.war
Normal file
BIN
target/web-3-1.0-SNAPSHOT.war
Normal file
Binary file not shown.
3
target/web-3-1.0-SNAPSHOT/WEB-INF/classes/db.properties
Normal file
3
target/web-3-1.0-SNAPSHOT/WEB-INF/classes/db.properties
Normal 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.
Binary file not shown.
Binary file not shown.
26
target/web-3-1.0-SNAPSHOT/WEB-INF/faces-config.xml
Normal file
26
target/web-3-1.0-SNAPSHOT/WEB-INF/faces-config.xml
Normal 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>
|
BIN
target/web-3-1.0-SNAPSHOT/WEB-INF/lib/checker-qual-3.31.0.jar
Normal file
BIN
target/web-3-1.0-SNAPSHOT/WEB-INF/lib/checker-qual-3.31.0.jar
Normal file
Binary file not shown.
Binary file not shown.
BIN
target/web-3-1.0-SNAPSHOT/WEB-INF/lib/jakarta.faces-3.0.0.jar
Normal file
BIN
target/web-3-1.0-SNAPSHOT/WEB-INF/lib/jakarta.faces-3.0.0.jar
Normal file
Binary file not shown.
BIN
target/web-3-1.0-SNAPSHOT/WEB-INF/lib/postgresql-42.6.0.jar
Normal file
BIN
target/web-3-1.0-SNAPSHOT/WEB-INF/lib/postgresql-42.6.0.jar
Normal file
Binary file not shown.
Binary file not shown.
30
target/web-3-1.0-SNAPSHOT/WEB-INF/web.xml
Normal file
30
target/web-3-1.0-SNAPSHOT/WEB-INF/web.xml
Normal 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
target/web-3-1.0-SNAPSHOT/index.xhtml
Normal file
124
target/web-3-1.0-SNAPSHOT/index.xhtml
Normal 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
target/web-3-1.0-SNAPSHOT/main.xhtml
Normal file
103
target/web-3-1.0-SNAPSHOT/main.xhtml
Normal 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>
|
181
target/web-3-1.0-SNAPSHOT/resources/css/styles.css
Normal file
181
target/web-3-1.0-SNAPSHOT/resources/css/styles.css
Normal 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;
|
||||
}
|
178
target/web-3-1.0-SNAPSHOT/resources/js/canvas.js
Normal file
178
target/web-3-1.0-SNAPSHOT/resources/js/canvas.js
Normal 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();
|
||||
});
|
25
target/web-3-1.0-SNAPSHOT/templates/base.xhtml
Normal file
25
target/web-3-1.0-SNAPSHOT/templates/base.xhtml
Normal 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
33
web-3.iml
Normal 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>
|
4
wildfly/.galleon/hashes/appclient/configuration/hashes
Normal file
4
wildfly/.galleon/hashes/appclient/configuration/hashes
Normal file
|
@ -0,0 +1,4 @@
|
|||
appclient.xml
|
||||
532495c876209d571f74d5a3300d22536f9746a1
|
||||
logging.properties
|
||||
f23d8fbead4340131038bf8f07af607f9b73134b
|
8
wildfly/.galleon/hashes/bin/client/hashes
Normal file
8
wildfly/.galleon/hashes/bin/client/hashes
Normal file
|
@ -0,0 +1,8 @@
|
|||
README-CLI-JCONSOLE.txt
|
||||
4170faae58c767cc5b7f82c1aff27184eef5a4a0
|
||||
README-EJB-JMS.txt
|
||||
a996dcda2c002b59d2728c263d5f105a8c79c2bd
|
||||
jboss-cli-client.jar
|
||||
acd8deaa6b74f761fb74ff0dffe53a0183b9f46f
|
||||
jboss-client.jar
|
||||
411c2afa8448065abf23c104160edf00ad01bb58
|
106
wildfly/.galleon/hashes/bin/hashes
Normal file
106
wildfly/.galleon/hashes/bin/hashes
Normal 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
|
2
wildfly/.galleon/hashes/docs/contrib/scripts/hashes
Normal file
2
wildfly/.galleon/hashes/docs/contrib/scripts/hashes
Normal file
|
@ -0,0 +1,2 @@
|
|||
README.md
|
||||
a503e1f53e876dff2dabbb5e0dfccd4c9b07192f
|
|
@ -0,0 +1,6 @@
|
|||
wildfly-init-debian.sh
|
||||
fa501ea0a2a20b75eb537c3ba0f56c8be6dbd6a3
|
||||
wildfly-init-redhat.sh
|
||||
62b0e3f39cf470646f4ac06a2e9e903f95bb5054
|
||||
wildfly.conf
|
||||
c9137d05357cfb2c33feb3b01ae666d254057623
|
|
@ -0,0 +1,2 @@
|
|||
wildfly-service.exe
|
||||
b62a0082e9780327ff7681b9c05da2d706476e42
|
|
@ -0,0 +1,6 @@
|
|||
service.bat
|
||||
d849c6b71473cb85d5079cfc5eb2bc6735ed5650
|
||||
wildfly-mgr.exe
|
||||
39cd9893df296428257366dce25110f0eff4c07b
|
||||
wildfly-service.exe
|
||||
6e4a3a72fb9bd66b6f6755ea3c1fa922a3073453
|
|
@ -0,0 +1,8 @@
|
|||
README
|
||||
ea7d8cf2c8a88751a1681275d4d7e3191140647d
|
||||
launch.sh
|
||||
296ca556f9627ca313528d8e53a400d42241b5e5
|
||||
wildfly.conf
|
||||
41f6c8dcfe4fad4aa43f8aed8f1eb78c58ffb71f
|
||||
wildfly.service
|
||||
152a4416c489fca0f8b6a4b474fc8f7efd484665
|
30
wildfly/.galleon/hashes/docs/examples/configs/hashes
Normal file
30
wildfly/.galleon/hashes/docs/examples/configs/hashes
Normal 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
|
2
wildfly/.galleon/hashes/docs/examples/hashes
Normal file
2
wildfly/.galleon/hashes/docs/examples/hashes
Normal file
|
@ -0,0 +1,2 @@
|
|||
enable-microprofile.cli
|
||||
2dd0552bcfc0007fd139808b3fc99fc741f17de1
|
56
wildfly/.galleon/hashes/docs/licenses/hashes
Normal file
56
wildfly/.galleon/hashes/docs/licenses/hashes
Normal 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
|
1072
wildfly/.galleon/hashes/docs/schema/hashes
Normal file
1072
wildfly/.galleon/hashes/docs/schema/hashes
Normal file
File diff suppressed because it is too large
Load Diff
20
wildfly/.galleon/hashes/domain/configuration/hashes
Normal file
20
wildfly/.galleon/hashes/domain/configuration/hashes
Normal 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
|
8
wildfly/.galleon/hashes/hashes
Normal file
8
wildfly/.galleon/hashes/hashes
Normal file
|
@ -0,0 +1,8 @@
|
|||
LICENSE.txt
|
||||
58853eb8199b5afe72a73a25fd8cf8c94285174b
|
||||
README.txt
|
||||
4e02800d2609dc82e957cfcf5eae12eeb1120349
|
||||
copyright.txt
|
||||
165a59628b050f2faa2477a2a62a92aa024ca1e3
|
||||
jboss-modules.jar
|
||||
ad33a0ca75c8189ebbfd8eedbb489a1453b96dea
|
|
@ -0,0 +1,6 @@
|
|||
asm-9.7.jar
|
||||
073d7b3086e14beb604ced229c302feff6449723
|
||||
asm-util-9.7.jar
|
||||
c0655519f24d92af2202cb681cd7c1569df6ead6
|
||||
module.xml
|
||||
2fdd92766986752fe05bf9e499a5b89fbfed4b5a
|
|
@ -0,0 +1,4 @@
|
|||
hppc-0.8.1.jar
|
||||
ffc7ba8f289428b9508ab484b8001dea944ae603
|
||||
module.xml
|
||||
7ff9b09d68ddb811bca586f99c7e4895fc11cc99
|
|
@ -0,0 +1,4 @@
|
|||
classmate-1.5.1.jar
|
||||
3fe0bed568c62df5e89f4f174c101eab25345b6c
|
||||
module.xml
|
||||
2c2407d2d12a8b2cd853b25ca0592659cf961c23
|
|
@ -0,0 +1,4 @@
|
|||
jackson-annotations-2.17.0.jar
|
||||
880a742337010da4c851f843d8cac150e22dff9f
|
||||
module.xml
|
||||
e4a8dbea35ecf4bdb108eefc4f7a5fefc2bd8ad0
|
|
@ -0,0 +1,4 @@
|
|||
jackson-core-2.17.0.jar
|
||||
a6e5058ef9720623c517252d17162f845306ff3a
|
||||
module.xml
|
||||
68cdc0d521772e10b6bd0ed00f8e9d5d1a8fa58c
|
|
@ -0,0 +1,4 @@
|
|||
jackson-databind-2.17.0.jar
|
||||
7173e9e1d4bc6d7ca03bc4eeedcd548b8b580b34
|
||||
module.xml
|
||||
afae2e2a7304f640bd4c77db1e7013cb48e6fbce
|
|
@ -0,0 +1,4 @@
|
|||
jackson-dataformat-yaml-2.17.0.jar
|
||||
57a963c6258c49febc11390082d8503f71bb15a9
|
||||
module.xml
|
||||
43440d6ca1b0a4d926a413a73f59c4adae389922
|
|
@ -0,0 +1,4 @@
|
|||
jackson-datatype-jdk8-2.17.0.jar
|
||||
95519a116d909faec29da76cf6b944b4a84c2c26
|
||||
module.xml
|
||||
4f672ef5b562b6de8be01280e228d87f3cdab036
|
|
@ -0,0 +1,4 @@
|
|||
jackson-datatype-jsr310-2.17.0.jar
|
||||
3fab507bba9d477e52ed2302dc3ddbd23cbae339
|
||||
module.xml
|
||||
f3e236cbeb6c19474f74c1798dd38dbc66b7a4a6
|
|
@ -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
|
|
@ -0,0 +1,2 @@
|
|||
module.xml
|
||||
09257ddbe3ca160f3ccae184177749efb82a72ce
|
|
@ -0,0 +1,4 @@
|
|||
caffeine-3.1.8.jar
|
||||
24795585df8afaf70a2cd534786904ea5889c047
|
||||
module.xml
|
||||
b5d5c01752d3997d117ec900faa1f167a9b1c285
|
|
@ -0,0 +1,4 @@
|
|||
btf-1.2.jar
|
||||
9e66651022eb86301b348d57e6f59459effc343b
|
||||
module.xml
|
||||
25ed39b0eb6131b1b16f5ad02344a2c4a6bce80c
|
|
@ -0,0 +1,4 @@
|
|||
jackson-coreutils-1.8.jar
|
||||
491a6e1130a180c153df9f2b7aabd7a700282c67
|
||||
module.xml
|
||||
edd282e5b4a283be2818d75ca8d9f12147a5f241
|
|
@ -0,0 +1,4 @@
|
|||
json-patch-1.9.jar
|
||||
0a4c3c97a0f5965dec15795acf40d3fbc897af4b
|
||||
module.xml
|
||||
d617d8be6e99f49dbf75754fb3b4568b38237e6b
|
|
@ -0,0 +1,4 @@
|
|||
module.xml
|
||||
55470daae6c253ebf9e114335255bd209e7a4c1e
|
||||
msg-simple-1.1.jar
|
||||
f261263e13dd4cfa93cc6b83f1f58f619097a2c4
|
|
@ -0,0 +1,4 @@
|
|||
module.xml
|
||||
d614911cd191a7d479ffa4ac976e043eb963a02e
|
||||
zstd-jni-1.5.6-5.jar
|
||||
6b0abf5f2e68df5ffac02cba09fc2d84f7ebd631
|
|
@ -0,0 +1,4 @@
|
|||
gson-2.8.9.jar
|
||||
8a432c1d6825781e21a02db2e2c33c5fde2833b9
|
||||
module.xml
|
||||
e9fece80c079e4436e45267429813501f4852b2d
|
|
@ -0,0 +1,4 @@
|
|||
failureaccess-1.0.2.jar
|
||||
c4a06a64e650562f30b7bf9aaec1bfed43aca12b
|
||||
module.xml
|
||||
7d7ad1fd8299119798c90c5915e4993f56711804
|
|
@ -0,0 +1,4 @@
|
|||
guava-33.0.0-jre.jar
|
||||
161ba27964a62f241533807a46b8711b13c1d94b
|
||||
module.xml
|
||||
5b9a85ab34e0fe19c3a3b31f4954ae40db2b600f
|
|
@ -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
|
|
@ -0,0 +1,4 @@
|
|||
JavaEWAH-1.2.3.jar
|
||||
13a27c856e0c8808cee9a64032c58eee11c3adc9
|
||||
module.xml
|
||||
cbc42f2e507993437ba185fdd71dd24fc070c32d
|
|
@ -0,0 +1,4 @@
|
|||
h2-2.2.224.jar
|
||||
7bdade27d8cd197d9b5ce9dc251f41d2edc5f7ad
|
||||
module.xml
|
||||
8f9bda63c7655da79d2d54a359bcadc474b66143
|
|
@ -0,0 +1,4 @@
|
|||
asyncutil-0.1.0.jar
|
||||
440941c382166029a299602e6c9ff5abde1b5143
|
||||
module.xml
|
||||
4a7d1e02072bbab6c935aa93fc915c26b7c5feae
|
|
@ -0,0 +1,4 @@
|
|||
azure-storage-8.6.6.jar
|
||||
49d84b103a4700134ce56d73b4195f18fd226729
|
||||
module.xml
|
||||
0c37ed43810e653e80519241466019e2ee2d8f82
|
|
@ -0,0 +1,4 @@
|
|||
module.xml
|
||||
0d381cde567d8896a94fe44993a10758ed433b49
|
||||
nimbus-jose-jwt-9.37.3.jar
|
||||
700f71ffefd60c16bd8ce711a956967ea9071cec
|
|
@ -0,0 +1,4 @@
|
|||
module.xml
|
||||
29f238d58ebc8744f45165df41858bf9c0ca4782
|
||||
protoparser-4.0.3.jar
|
||||
e61ee0b108059d97f43143eb2ee7a1be8059a30e
|
|
@ -0,0 +1,2 @@
|
|||
module.xml
|
||||
863fd9eefeafd585ab00c7c1d91a8b16c82f7ab9
|
|
@ -0,0 +1,4 @@
|
|||
FastInfoset-2.1.1.jar
|
||||
650c84348bbcf4461bd24d38e67f7a7ce687de24
|
||||
module.xml
|
||||
a18a415193ecb4584702dba76cff75e83b457330
|
|
@ -0,0 +1,6 @@
|
|||
module.xml
|
||||
4036fdadd18b5ac952d374077e9e8c43ae7deba9
|
||||
saaj-impl-3.0.0.jar
|
||||
592e76b886471149217e4090b02e3d36fd702777
|
||||
stax-ex-2.1.0.jar
|
||||
33160568d70c01da407f8ba982bacf283d00ad4a
|
|
@ -0,0 +1,4 @@
|
|||
module.xml
|
||||
c62ca7298e8392d9d3e0405e6ee250e523cb3ac3
|
||||
pem-keystore-2.4.0.jar
|
||||
a4ba3c7b740b9dada642e1b219d537bafd8c237c
|
|
@ -0,0 +1,4 @@
|
|||
java-getopt-1.0.13.jar
|
||||
bb29ac2c2ab8b92945f01706de4b56c97989c6a9
|
||||
module.xml
|
||||
5b1ec5d7710dff2dbc3beceda959bcc47ddbec8e
|
|
@ -0,0 +1,2 @@
|
|||
module.xml
|
||||
7f680a09778318f400ff51232088d954c87c4c6f
|
|
@ -0,0 +1,4 @@
|
|||
jakarta.json-1.1.6.jar
|
||||
a39aba0ef0a70c3f54a44a2c539a4f11c9bb07e8
|
||||
module.xml
|
||||
2abfebbc96fe44e75ccc1d75cb3e3ecd7ba206a2
|
|
@ -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
|
|
@ -0,0 +1,4 @@
|
|||
grpc-api-1.58.0.jar
|
||||
1f761949cdfd418a5f662e0d22d2c95f60099c0b
|
||||
module.xml
|
||||
39c980c6ee79ec175bea6c3786f38e55854f50fd
|
|
@ -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
|
|
@ -0,0 +1,4 @@
|
|||
module.xml
|
||||
564bd5c25de23bf6aae2a283bba4d0ac1646fa00
|
||||
netty-buffer-4.1.115.Final.jar
|
||||
d5daf1030e5c36d198caf7562da2441a97ec0df6
|
|
@ -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
Loading…
Reference in New Issue
Block a user