Skip to content
Snippets Groups Projects
Commit 7a5a6654 authored by Julian Horner's avatar Julian Horner
Browse files

Finish chapter 9.4.1.3

parent f5833547
No related branches found
No related tags found
No related merge requests found
Showing
with 111 additions and 120 deletions
...@@ -14,7 +14,7 @@ import javax.validation.constraints.Size; ...@@ -14,7 +14,7 @@ import javax.validation.constraints.Size;
* @author Julian * @author Julian
*/ */
@Embeddable @Embeddable
public class Account { public class Account extends DateEntity {
//---------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------
@NotNull @NotNull
......
...@@ -14,6 +14,7 @@ import javax.persistence.CascadeType; ...@@ -14,6 +14,7 @@ import javax.persistence.CascadeType;
import javax.persistence.Column; import javax.persistence.Column;
import javax.persistence.Embedded; import javax.persistence.Embedded;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue; import javax.persistence.GeneratedValue;
import javax.persistence.Id; import javax.persistence.Id;
import javax.persistence.ManyToOne; import javax.persistence.ManyToOne;
...@@ -36,7 +37,8 @@ import javax.validation.constraints.Size; ...@@ -36,7 +37,8 @@ import javax.validation.constraints.Size;
@NamedQuery(name = Campaign.getAmountDonatedSoFar, @NamedQuery(name = Campaign.getAmountDonatedSoFar,
query = "SELECT SUM(d.amount) FROM Donation d WHERE d.campaign = :campaign") }) query = "SELECT SUM(d.amount) FROM Donation d WHERE d.campaign = :campaign") })
@Entity @Entity
public class Campaign { @EntityListeners(EntityCreationListener.class)
public class Campaign extends DateEntity {
public static final String findByOrganizer = "Campaign.findByOrganizer"; public static final String findByOrganizer = "Campaign.findByOrganizer";
public static final String findAll = "Campaign.findAll"; public static final String findAll = "Campaign.findAll";
......
...@@ -5,10 +5,24 @@ ...@@ -5,10 +5,24 @@
package de.dpunkt.myaktion.model; package de.dpunkt.myaktion.model;
import java.util.Date;
import javax.persistence.EntityListeners;
/** /**
* @author Julian * @author Julian
* *
*/ */
public class DateEntity { public class DateEntity {
private Date createdAt;
public Date getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Date createdAt) {
this.createdAt = createdAt;
}
} }
...@@ -24,7 +24,7 @@ import javax.validation.constraints.Size; ...@@ -24,7 +24,7 @@ import javax.validation.constraints.Size;
@Entity @Entity
@NamedQueries({ @NamedQuery(name = Donation.findByStatus, @NamedQueries({ @NamedQuery(name = Donation.findByStatus,
query = "SELECT d FROM Donation d WHERE d.status = :status") }) query = "SELECT d FROM Donation d WHERE d.status = :status") })
public class Donation { public class Donation extends DateEntity {
//---------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------
public static final String findByStatus = "Donation.findByStatus"; public static final String findByStatus = "Donation.findByStatus";
......
package de.dpunkt.myaktion.model;
import java.util.Date;
import javax.persistence.PrePersist;
public class EntityCreationListener {
@PrePersist
void onPreUpdate(Object entity) {
DateEntity dateEntity = (DateEntity) entity;
dateEntity.setCreatedAt(new Date());
}
}
...@@ -19,7 +19,7 @@ import javax.validation.constraints.Size; ...@@ -19,7 +19,7 @@ import javax.validation.constraints.Size;
@NamedQueries({ @NamedQuery(name = Organizer.findByEmail, @NamedQueries({ @NamedQuery(name = Organizer.findByEmail,
query = "SELECT o FROM Organizer o WHERE o.email = :email") }) query = "SELECT o FROM Organizer o WHERE o.email = :email") })
@Entity @Entity
public class Organizer { public class Organizer extends DateEntity {
public static final String findByEmail = "Organizer.findByEmail"; public static final String findByEmail = "Organizer.findByEmail";
@NotNull @NotNull
......
package de.dpunkt.myaktion.resources;
import java.util.List;
import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import de.dpunkt.myaktion.model.Campaign;
import de.dpunkt.myaktion.services.CampaignService;
@Path("/organizer/campaign")
public class CampaignResource {
@Inject
private CampaignService campaignService;
@GET
@Path("/list")
@Produces(MediaType.APPLICATION_JSON)
public List<Campaign> getAllCampaigns() {
List<Campaign> allCampaigns = campaignService.getAllCampaigns();
allCampaigns.forEach(campaign -> {
campaign.setDonations(null);
campaign.setOrganizer(null);
});
return allCampaigns;
}
@DELETE
@Path("/{campaignId}")
public void deleteAktion(@PathParam(value = "campaignId") Long campaignId) {
campaignService.deleteCampaign(campaignId);
}
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Campaign addCampaign(Campaign campaign) {
return campaignService.addCampaign(campaign);
}
}
\ No newline at end of file
...@@ -17,11 +17,15 @@ public interface CampaignService { ...@@ -17,11 +17,15 @@ public interface CampaignService {
List<Campaign> getAllCampaigns(); List<Campaign> getAllCampaigns();
void addCampaign(Campaign campaign); Campaign addCampaign(Campaign campaign);
void deleteCampaign(Campaign campaign); void deleteCampaign(Campaign campaign);
void deleteCampaign(Long campaignId);
void updateCampaign(Campaign campaign); void updateCampaign(Campaign campaign);
Campaign getCampaign(Long campaignId);
//---------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------
} }
\ No newline at end of file
...@@ -60,11 +60,14 @@ public class CampaignServiceBean implements CampaignService { ...@@ -60,11 +60,14 @@ public class CampaignServiceBean implements CampaignService {
// ---------------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------------
@Override @Override
public void addCampaign(Campaign campaign) { public Campaign addCampaign(Campaign campaign) {
Organizer organizer = getLoggedinOrganizer(); Organizer organizer = getLoggedinOrganizer();
campaign.setOrganizer(organizer); campaign.setOrganizer(organizer);
entityManager.persist(campaign); entityManager.persist(campaign);
return campaign;
} }
// ---------------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------------
@Override @Override
...@@ -80,6 +83,17 @@ public class CampaignServiceBean implements CampaignService { ...@@ -80,6 +83,17 @@ public class CampaignServiceBean implements CampaignService {
entityManager.remove(managedCampaign); entityManager.remove(managedCampaign);
} }
public void deleteCampaign(Long campaignId) {
Campaign managedCampaign = getCampaign(campaignId);
entityManager.remove(managedCampaign);
}
public Campaign getCampaign(Long campaignId) {
Campaign managedCampaign = entityManager.find(Campaign.class, campaignId);
return managedCampaign;
}
// ---------------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------------
private BigDecimal getAmountDonatedSoFar(Campaign campaign) { private BigDecimal getAmountDonatedSoFar(Campaign campaign) {
......
/*
* Copyright 2019 (C) by Julian Horner.
* All Rights Reserved.
*/
package de.dpunkt.myaktion.services;
import java.math.BigDecimal;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateless;
import javax.enterprise.inject.Alternative;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.ParameterExpression;
import javax.persistence.criteria.Root;
import de.dpunkt.myaktion.model.Campaign;
import de.dpunkt.myaktion.model.Donation;
import de.dpunkt.myaktion.util.Log.TecLog;
/**
* @author Julian
*/
@Stateless
@Alternative
public class CriteriaCampaignServiceBean implements CampaignService {
//----------------------------------------------------------------------------------------------
@Inject
@TecLog
private Logger logger;
@Inject
EntityManager entityManager;
//----------------------------------------------------------------------------------------------
@Override
public List<Campaign> getAllCampaigns() {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Campaign> criteriaQuery = cb.createQuery(Campaign.class);
Root<Campaign> campaignRoot = criteriaQuery.from(Campaign.class);
criteriaQuery.select(campaignRoot).orderBy(cb.asc(campaignRoot.get("name")));
TypedQuery<Campaign> query = entityManager.createQuery(criteriaQuery);
List<Campaign> campaigns = query.getResultList();
// campaigns.forEach(campaign ->
// campaign.setAmountDonatedSoFar(new BigDecimal(getAmountDonatedSoFar(campaign))));
for (Campaign campaign : campaigns) {
campaign.setAmountDonatedSoFar(new BigDecimal(getAmountDonatedSoFar(campaign)));
}
logger.log(Level.INFO, "Loaded all campaign entities with criteria query");
return campaigns;
}
//----------------------------------------------------------------------------------------------
@Override
public void addCampaign(Campaign campaign) {
entityManager.persist(campaign);
}
//----------------------------------------------------------------------------------------------
@Override
public void updateCampaign(Campaign campaign) {
entityManager.merge(campaign);
}
//----------------------------------------------------------------------------------------------
@Override
public void deleteCampaign(Campaign campaign) {
Campaign managedCampaign = entityManager.find(Campaign.class, campaign.getId());
entityManager.remove(managedCampaign);
}
//----------------------------------------------------------------------------------------------
private Double getAmountDonatedSoFar(Campaign campaign) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Double> criteriaQuery = criteriaBuilder.createQuery(Double.class);
Root<Donation> donation = criteriaQuery.from(Donation.class);
ParameterExpression<Campaign> campaignParameter = criteriaBuilder.parameter(Campaign.class);
criteriaQuery.select(criteriaBuilder.sumAsDouble(donation.get("amount")))
.where(criteriaBuilder.equal(donation.get("campaign"), campaignParameter));
TypedQuery<Double> query = entityManager.createQuery(criteriaQuery);
query.setParameter(campaignParameter, campaign);
Double result = query.getSingleResult();
if (result == null)
result = 0d;
return result;
}
//----------------------------------------------------------------------------------------------
}
\ No newline at end of file
...@@ -16,6 +16,10 @@ http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" ...@@ -16,6 +16,10 @@ http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
<web-resource-name>organizer</web-resource-name> <web-resource-name>organizer</web-resource-name>
<url-pattern>/organizer/*</url-pattern> <url-pattern>/organizer/*</url-pattern>
</web-resource-collection> </web-resource-collection>
<web-resource-collection>
<web-resource-name>organizer access via REST</web-resource-name>
<url-pattern>/rest/organizer/*</url-pattern>
</web-resource-collection>
<auth-constraint> <auth-constraint>
<role-name>Organizer</role-name> <role-name>Organizer</role-name>
</auth-constraint> </auth-constraint>
...@@ -26,4 +30,8 @@ http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" ...@@ -26,4 +30,8 @@ http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
<security-role> <security-role>
<role-name>Organizer</role-name> <role-name>Organizer</role-name>
</security-role> </security-role>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app> </web-app>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment