Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
alx_java2b_20250412
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Patryk Czarnik
alx_java2b_20250412
Commits
3ce733df
Commit
3ce733df
authored
May 24, 2025
by
Patryk Czarnik
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Ostateczna wersja projektu RestServer
parent
dc5176dc
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
195 additions
and
1 deletions
+195
-1
pom.xml
PC26-RestSerwer/pom.xml
+2
-1
Customer.java
PC26-RestSerwer/src/main/java/sklep/model/Customer.java
+3
-0
Order.java
PC26-RestSerwer/src/main/java/sklep/model/Order.java
+2
-0
RCustomer.java
PC26-RestSerwer/src/main/java/sklep/rest/RCustomer.java
+78
-0
ROrder.java
PC26-RestSerwer/src/main/java/sklep/rest/ROrder.java
+87
-0
RecordNotFoundMapper.java
...er/src/main/java/sklep/rest/ext/RecordNotFoundMapper.java
+22
-0
sklep-fo.xsl
PC26-RestSerwer/src/main/webapp/WEB-INF/sklep-fo.xsl
+1
-0
No files found.
PC26-RestSerwer/pom.xml
View file @
3ce733df
...
...
@@ -35,12 +35,13 @@
<groupId>
org.apache.xmlgraphics
</groupId>
<artifactId>
fop
</artifactId>
<version>
2.11
</version>
<!-- To jest potrzebne, gdy kompiluję w Eclipse, ale javac i IntelliJ działają bez tego:
<exclusions>
<exclusion>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
</exclusion>
</exclusions>
</exclusions>
-->
</dependency>
</dependencies>
...
...
PC26-RestSerwer/src/main/java/sklep/model/Customer.java
View file @
3ce733df
...
...
@@ -2,6 +2,9 @@ package sklep.model;
import
java.util.Objects
;
import
jakarta.xml.bind.annotation.XmlRootElement
;
@XmlRootElement
public
class
Customer
{
private
String
email
;
private
String
name
;
...
...
PC26-RestSerwer/src/main/java/sklep/model/Order.java
View file @
3ce733df
...
...
@@ -10,8 +10,10 @@ import java.util.Objects;
import
jakarta.xml.bind.annotation.XmlAttribute
;
import
jakarta.xml.bind.annotation.XmlElement
;
import
jakarta.xml.bind.annotation.XmlElementWrapper
;
import
jakarta.xml.bind.annotation.XmlRootElement
;
import
jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter
;
@XmlRootElement
public
class
Order
{
@XmlAttribute
(
name
=
"id"
)
private
Integer
orderId
;
...
...
PC26-RestSerwer/src/main/java/sklep/rest/RCustomer.java
0 → 100644
View file @
3ce733df
package
sklep
.
rest
;
import
java.util.List
;
import
jakarta.enterprise.context.RequestScoped
;
import
jakarta.ws.rs.Consumes
;
import
jakarta.ws.rs.DELETE
;
import
jakarta.ws.rs.GET
;
import
jakarta.ws.rs.POST
;
import
jakarta.ws.rs.PUT
;
import
jakarta.ws.rs.Path
;
import
jakarta.ws.rs.PathParam
;
import
jakarta.ws.rs.Produces
;
import
jakarta.ws.rs.core.Response
;
import
jakarta.ws.rs.core.UriBuilder
;
import
sklep.db.CustomerDAO
;
import
sklep.db.DBConnection
;
import
sklep.db.DBException
;
import
sklep.db.RecordNotFound
;
import
sklep.model.Customer
;
@RequestScoped
@Path
(
"/customers"
)
@Produces
({
"application/xml"
,
"application/json"
})
@Consumes
({
"application/xml"
,
"application/json"
})
public
class
RCustomer
{
@POST
public
Response
save
(
final
Customer
customer
)
throws
DBException
{
try
(
DBConnection
db
=
DBConnection
.
open
())
{
CustomerDAO
customerDAO
=
db
.
customerDAO
();
customerDAO
.
save
(
customer
);
db
.
commit
();
return
Response
.
created
(
UriBuilder
.
fromResource
(
RCustomer
.
class
).
path
(
String
.
valueOf
(
customer
.
getEmail
())).
build
()).
build
();
}
}
@GET
@Path
(
"/{id}"
)
public
Customer
findById
(
@PathParam
(
"id"
)
final
String
email
)
throws
DBException
,
RecordNotFound
{
try
(
DBConnection
db
=
DBConnection
.
open
())
{
CustomerDAO
customerDAO
=
db
.
customerDAO
();
return
customerDAO
.
findByEmail
(
email
);
}
}
@GET
public
List
<
Customer
>
listAll
()
throws
DBException
{
try
(
DBConnection
db
=
DBConnection
.
open
())
{
CustomerDAO
customerDAO
=
db
.
customerDAO
();
return
customerDAO
.
readAll
();
}
}
@PUT
@Path
(
"/{id}"
)
public
Response
update
(
@PathParam
(
"id"
)
String
email
,
final
Customer
customer
)
throws
DBException
{
try
(
DBConnection
db
=
DBConnection
.
open
())
{
CustomerDAO
customerDAO
=
db
.
customerDAO
();
customer
.
setEmail
(
email
);
customerDAO
.
save
(
customer
);
db
.
commit
();
}
return
Response
.
noContent
().
build
();
}
@DELETE
@Path
(
"/{id}"
)
public
Response
deleteById
(
@PathParam
(
"id"
)
String
email
)
throws
DBException
{
try
(
DBConnection
db
=
DBConnection
.
open
())
{
CustomerDAO
customerDAO
=
db
.
customerDAO
();
customerDAO
.
delete
(
email
);
db
.
commit
();
}
return
Response
.
noContent
().
build
();
}
}
PC26-RestSerwer/src/main/java/sklep/rest/ROrder.java
0 → 100644
View file @
3ce733df
package
sklep
.
rest
;
import
java.net.URI
;
import
java.util.List
;
import
jakarta.enterprise.context.RequestScoped
;
import
jakarta.ws.rs.Consumes
;
import
jakarta.ws.rs.GET
;
import
jakarta.ws.rs.Path
;
import
jakarta.ws.rs.PathParam
;
import
jakarta.ws.rs.Produces
;
import
jakarta.ws.rs.core.Response
;
import
jakarta.ws.rs.core.Response.Status
;
import
jakarta.ws.rs.core.UriBuilder
;
import
sklep.db.DBConnection
;
import
sklep.db.DBException
;
import
sklep.db.OrderDAO
;
import
sklep.db.RecordNotFound
;
import
sklep.model.Order
;
@RequestScoped
@Path
(
"/orders"
)
@Produces
({
"application/xml"
,
"application/json"
})
@Consumes
({
"application/xml"
,
"application/json"
})
public
class
ROrder
{
@GET
public
List
<
Order
>
listAll
()
throws
DBException
{
try
(
DBConnection
db
=
DBConnection
.
open
())
{
OrderDAO
orderDAO
=
db
.
orderDAO
();
return
orderDAO
.
readAll
();
}
}
@GET
@Path
(
"/{id:[0-9][0-9]*}"
)
public
Response
findById
(
@PathParam
(
"id"
)
final
Integer
id
)
{
// Klasa Response pozwala nam z pełną precyzją przygotować odpowiedź, która ma zostać odesłana klientowi.
// W przypadku pozytywnym (ok) zostanie odesłany obiekt przetłumaczony na XML lub JSON, a kod wynikowy to będzie 200.
// Ale w przypadku błędów możemy sami zdecydować co odsyłami (tutaj odpowiednie kody HTTP).
try
(
DBConnection
db
=
DBConnection
.
open
())
{
OrderDAO
orderDAO
=
db
.
orderDAO
();
Order
order
=
orderDAO
.
findById
(
id
);
return
Response
.
ok
(
order
).
build
();
}
catch
(
DBException
e
)
{
e
.
printStackTrace
();
return
Response
.
status
(
Status
.
INTERNAL_SERVER_ERROR
).
build
();
}
catch
(
RecordNotFound
e
)
{
return
Response
.
status
(
Status
.
NOT_FOUND
).
build
();
}
}
/*
// Metoda, która ma obsłużyć pobranie info o właścicielu zamówienia:
// /orders/1/customer
// W tej wersji metoda zwraca bezpośrednio dane klienta.
// Wada tego podejścia: ten sam rekord (konkretny klient) jest widoczny pod różnymi adresami URL.
@GET
@Path("/{id:[0-9][0-9]*}/customer")
public Customer getCustomer(@PathParam("id") Integer orderId) throws DBException, RecordNotFound {
try(DBConnection db = DBConnection.open()) {
OrderDAO orderDAO = db.orderDAO();
CustomerDAO customerDAO = db.customerDAO();
Order order = orderDAO.findById(orderId);
Customer customer = customerDAO.findByEmail(order.getCustomerEmail());
return customer;
}
}
*/
// W tej wersji w odpowiedzi na zapytanie o dane klienta, który złożył zamówienie,
// wyślemy przekierowanie pod adres tego klienta.
// To jest lepsze z punktu widzenia "dobrych praktyk REST".
@GET
@Path
(
"/{id:[0-9][0-9]*}/customer"
)
public
Response
getCustomer
(
@PathParam
(
"id"
)
Integer
orderId
)
throws
DBException
,
RecordNotFound
{
try
(
DBConnection
db
=
DBConnection
.
open
())
{
OrderDAO
orderDAO
=
db
.
orderDAO
();
Order
order
=
orderDAO
.
findById
(
orderId
);
URI
customerURI
=
UriBuilder
.
fromResource
(
RCustomer
.
class
)
.
path
(
"/{email}"
)
.
build
(
order
.
getCustomerEmail
());
return
Response
.
seeOther
(
customerURI
).
build
();
}
}
}
PC26-RestSerwer/src/main/java/sklep/rest/ext/RecordNotFoundMapper.java
0 → 100644
View file @
3ce733df
package
sklep
.
rest
.
ext
;
import
jakarta.ws.rs.core.Response
;
import
jakarta.ws.rs.ext.ExceptionMapper
;
import
jakarta.ws.rs.ext.Provider
;
import
sklep.db.RecordNotFound
;
@Provider
public
class
RecordNotFoundMapper
implements
ExceptionMapper
<
RecordNotFound
>
{
@Override
public
Response
toResponse
(
RecordNotFound
exception
)
{
String
html
=
"<html><body><h1>Nie znaleziono</h1><p style='color:red'>"
+
exception
.
getMessage
()
+
"</p></body></html>"
;
return
Response
.
status
(
404
)
.
type
(
"text/html"
)
.
entity
(
html
)
.
build
();
}
}
PC26-RestSerwer/src/main/webapp/WEB-INF/sklep-fo.xsl
View file @
3ce733df
...
...
@@ -26,6 +26,7 @@
<xsl:template
match=
"products"
>
<fo:block
font-weight=
"bold"
font-size=
"14pt"
>
Lista produktów (
<xsl:value-of
select=
"count(product)"
/>
elementów)
</fo:block>
<xsl:apply-templates/>
</xsl:template>
<xsl:template
match=
"product"
>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment