diff --git a/eBL-backend/pom.xml b/eBL-backend/pom.xml index ac4f70e..7b49bfb 100644 --- a/eBL-backend/pom.xml +++ b/eBL-backend/pom.xml @@ -226,7 +226,31 @@ 5.0.0 + + org.apache.jena + jena-core + 4.9.0 + + + + org.apache.jena + apache-jena-libs + 4.9.0 + pom + + + org.apache.jena + jena-rdfconnection + 4.9.0 + + + + org.apache.jena + jena + 4.9.0 + pom + diff --git a/eBL-backend/src/main/java/com/info7255/ebl/EBlApplication.java b/eBL-backend/src/main/java/com/info7255/ebl/EBlApplication.java index 7d62e8c..8df94d3 100644 --- a/eBL-backend/src/main/java/com/info7255/ebl/EBlApplication.java +++ b/eBL-backend/src/main/java/com/info7255/ebl/EBlApplication.java @@ -6,11 +6,13 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; +import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.web.filter.ShallowEtagHeaderFilter; import org.springframework.web.servlet.config.annotation.EnableWebMvc; //import javax.servlet.Filter; +@EnableAsync @Configuration @SpringBootApplication(exclude = {ErrorMvcAutoConfiguration.class}) @EnableWebMvc diff --git a/eBL-backend/src/main/java/com/info7255/ebl/controller/FreightController.java b/eBL-backend/src/main/java/com/info7255/ebl/controller/FreightController.java index e2a9bfd..c5c6512 100644 --- a/eBL-backend/src/main/java/com/info7255/ebl/controller/FreightController.java +++ b/eBL-backend/src/main/java/com/info7255/ebl/controller/FreightController.java @@ -5,6 +5,7 @@ import com.google.common.hash.Hashing; import com.info7255.ebl.MyToken; import com.info7255.ebl.repository.FreightDAO; +import com.info7255.ebl.service.QuoteService; import org.everit.json.schema.Schema; import org.everit.json.schema.loader.SchemaLoader; import org.json.JSONObject; @@ -39,6 +40,9 @@ public class FreightController { static ObjectMapper mapper = new ObjectMapper(); static String jws; + @Autowired + private QuoteService quoteService; + @PostMapping("/schema") public ResponseEntity saveSchema(@RequestBody JsonNode schema, @RequestHeader HttpHeaders headers) throws IOException { @@ -128,6 +132,10 @@ public ResponseEntity remove(@PathVariable String id, @RequestHeader HttpHeaders @PostMapping("/quote") public ResponseEntity quote(@RequestBody JsonNode quote, @RequestHeader HttpHeaders requestHeaders) { + + + quoteService.quote(quote); + return ResponseEntity.ok("Quoted"); } diff --git a/eBL-backend/src/main/java/com/info7255/ebl/event/QuoteEvent.java b/eBL-backend/src/main/java/com/info7255/ebl/event/QuoteEvent.java index 1a2f27c..f8e3158 100644 --- a/eBL-backend/src/main/java/com/info7255/ebl/event/QuoteEvent.java +++ b/eBL-backend/src/main/java/com/info7255/ebl/event/QuoteEvent.java @@ -11,7 +11,7 @@ public class QuoteEvent { private JsonNode quote; public QuoteEvent(JsonNode quote) { - quote = this.quote; + this.quote = quote; } public JsonNode getQuote() { diff --git a/eBL-backend/src/main/java/com/info7255/ebl/lisetener/EmailListeners.java b/eBL-backend/src/main/java/com/info7255/ebl/lisetener/EmailListeners.java index 82812aa..74cc6a8 100644 --- a/eBL-backend/src/main/java/com/info7255/ebl/lisetener/EmailListeners.java +++ b/eBL-backend/src/main/java/com/info7255/ebl/lisetener/EmailListeners.java @@ -1,20 +1,32 @@ package com.info7255.ebl.lisetener; +import com.info7255.ebl.entity.User; import com.info7255.ebl.event.QuoteEvent; +import com.info7255.ebl.repository.UserRepository; import com.info7255.ebl.service.EmailService; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; +import java.util.Optional; + @Component @RequiredArgsConstructor public class EmailListeners { + @Autowired + private UserRepository userRepository; private final EmailService emailService; + @Async @EventListener public void onRateQuotationEvent(QuoteEvent event){ - emailService.sendQuotationEmail(event.getQuote()); + Optional user = userRepository.findById(String.valueOf(event.getQuote().get("customerID"))); + + emailService.sendQuotationEmail(user, event.getQuote()); } } diff --git a/eBL-backend/src/main/java/com/info7255/ebl/lisetener/SemanticQuoteCreationListener.java b/eBL-backend/src/main/java/com/info7255/ebl/lisetener/SemanticQuoteCreationListener.java new file mode 100644 index 0000000..cc29c7d --- /dev/null +++ b/eBL-backend/src/main/java/com/info7255/ebl/lisetener/SemanticQuoteCreationListener.java @@ -0,0 +1,45 @@ +package com.info7255.ebl.lisetener; + +import com.fasterxml.jackson.databind.JsonNode; +import com.info7255.ebl.entity.User; +import com.info7255.ebl.event.QuoteEvent; +import com.info7255.ebl.repository.FreightDAO; +import com.info7255.ebl.repository.UserRepository; +import com.info7255.ebl.service.QuoteService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import java.util.Optional; + +@Slf4j +@Component +@RequiredArgsConstructor +public class SemanticQuoteCreationListener { + + @Autowired + private UserRepository userRepository; + + @Autowired + private QuoteService quoteService; + + @Autowired + private FreightDAO dao; + + @Async + @EventListener + public void onRateQuotationEvent(QuoteEvent event) { + + Optional user = userRepository.findById(String.valueOf(event.getQuote().get("customerID"))); + + log.info("Inside SemanticQuoteCreationListener", event); + + JsonNode rate = dao.findRateById(String.valueOf(event.getQuote().get("rateID"))); + + quoteService.generateRDF(rate, user, event.getQuote()); + + } +} diff --git a/eBL-backend/src/main/java/com/info7255/ebl/resource/VCARD.java b/eBL-backend/src/main/java/com/info7255/ebl/resource/VCARD.java new file mode 100644 index 0000000..d74af8b --- /dev/null +++ b/eBL-backend/src/main/java/com/info7255/ebl/resource/VCARD.java @@ -0,0 +1,28 @@ +package com.info7255.ebl.resource; + +import org.apache.jena.rdf.model.* ; + +/** VCARD vocabulary class for namespace http://www.w3.org/2001/vcard-rdf/3.0# + */ +public class VCARD { + + /** + * The namespace of the vocabulary as a string + */ + public static final String uri ="http://www.w3.org/2001/vcard-rdf/3.0#"; + + /** returns the URI for this schema + * @return the URI for this schema + */ + public static String getURI() { + return uri; + } + + private static final Model m = ModelFactory.createDefaultModel(); + + public static final Property TWENTY = m.createProperty(uri, "TWENTY" ); + public static final Property FORTY = m.createProperty(uri, "FORTY" ); + public static final Property FORTYHQ = m.createProperty(uri, "FORTYHQ" ); + public static final Property BUY = m.createProperty(uri, "BUY"); + public static final Property SELL = m.createProperty(uri, "SELL"); +} diff --git a/eBL-backend/src/main/java/com/info7255/ebl/service/EmailService.java b/eBL-backend/src/main/java/com/info7255/ebl/service/EmailService.java index 11fbfea..b47cbfb 100644 --- a/eBL-backend/src/main/java/com/info7255/ebl/service/EmailService.java +++ b/eBL-backend/src/main/java/com/info7255/ebl/service/EmailService.java @@ -1,14 +1,22 @@ package com.info7255.ebl.service; import com.fasterxml.jackson.databind.JsonNode; +import com.info7255.ebl.entity.User; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import java.util.Optional; + +@Slf4j +@Service public class EmailService { public EmailService() { } - public void sendQuotationEmail(JsonNode quote){ + public void sendQuotationEmail(Optional user, JsonNode quote){ + log.info("Email Quotation sent!", quote); } } diff --git a/eBL-backend/src/main/java/com/info7255/ebl/service/QuoteService.java b/eBL-backend/src/main/java/com/info7255/ebl/service/QuoteService.java index 01ce73d..5aee6bb 100644 --- a/eBL-backend/src/main/java/com/info7255/ebl/service/QuoteService.java +++ b/eBL-backend/src/main/java/com/info7255/ebl/service/QuoteService.java @@ -1,31 +1,61 @@ package com.info7255.ebl.service; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.info7255.ebl.entity.User; import com.info7255.ebl.event.QuoteEvent; import com.info7255.ebl.repository.FreightDAO; +import com.info7255.ebl.resource.VCARD; import lombok.Data; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.jena.rdf.model.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Component; +import java.util.Optional; +import java.util.UUID; + +@Slf4j @Component @RequiredArgsConstructor public class QuoteService { -// private final User user; - -// private final EmailService emailService; + ObjectMapper objectMapper = new ObjectMapper(); private final ApplicationEventPublisher publisher; public void quote(JsonNode quote) { -// emailService.sendQuotationEmail(quote); - publisher.publishEvent(new QuoteEvent(quote)); } + public void generateRDF(JsonNode rate, Optional user, JsonNode quote){ + + Model model = ModelFactory.createDefaultModel(); + + JsonNode ppJson = objectMapper.createObjectNode(); + + ((ObjectNode) ppJson).put("id", UUID.randomUUID().toString()); + ((ObjectNode) ppJson).put("pol", rate.get("pol")); + ((ObjectNode) ppJson).put("pod", rate.get("pod")); + + Resource portPair = model.createResource((Resource) ppJson); + + portPair.addProperty(VCARD.BUY, model.createResource() + .addProperty(VCARD.TWENTY, rate.get("twenty").asText()) + .addProperty(VCARD.FORTY, rate.get("forty").asText()) + .addProperty(VCARD.FORTYHQ, rate.get("fortyhq").asText())) + .addProperty(VCARD.SELL, model.createResource() + .addProperty(VCARD.TWENTY, quote.get("sellRate20").asText()) + .addProperty(VCARD.FORTY, quote.get("sellRate40").asText()) + .addProperty(VCARD.FORTYHQ, rate.get("sellRate40HQ").asText())); + + log.info("RDF created", portPair); + + } + } diff --git a/react-admin-dashboard/src/scenes/rates/index.jsx b/react-admin-dashboard/src/scenes/rates/index.jsx index 809ef3d..3e631dc 100644 --- a/react-admin-dashboard/src/scenes/rates/index.jsx +++ b/react-admin-dashboard/src/scenes/rates/index.jsx @@ -20,6 +20,7 @@ const Rates = () => { customers: [] }); const [openDialog, setOpenDialog] = useState(false); + const [selectedRowId, setSelectedRowId] = useState(null); const theme = useTheme(); const colors = tokens(theme.palette.mode); @@ -49,7 +50,8 @@ const Rates = () => { .then(() => console.log('Delete successful')); }; - const handleQuote = () => { + const handleQuote = (rowID) => { + setSelectedRowId(rowID); setOpenDialog(true); }; @@ -60,7 +62,7 @@ const Rates = () => { return ( handleQuote(params.row.id)} color="primary" aria-label="quote" > @@ -82,21 +84,21 @@ const Rates = () => { {custList.customers.length > 0 ? ( { - console.log(values); + console.log(selectedRowId); // Handle form submission fetch('http://localhost:8080/quote', { method: 'POST', headers: { 'Content-Type': 'application/json', }, - body: JSON.stringify({...values, ["rateID"]: params.row.id}) + body: JSON.stringify({...values, ["rateID"]: selectedRowId}) }) .then(response => { console.log(response.json()); @@ -125,7 +127,7 @@ const Rates = () => { >
- + {custList.customers.map((customer) => ( {customer.companyName}