Skip to content

Commit ccbd549

Browse files
Merge pull request #18475 from parthiv39731/9098
9098
2 parents afee810 + 5b87cf9 commit ccbd549

File tree

8 files changed

+269
-0
lines changed

8 files changed

+269
-0
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.baeldung.context.entity;
2+
3+
public class Trade {
4+
private String securityID;
5+
private int quantity;
6+
private double price;
7+
8+
public Trade(String securityID, int quantity, double price) {
9+
this.securityID = securityID;
10+
this.quantity = quantity;
11+
this.price = price;
12+
}
13+
14+
public String getSecurityID() {
15+
return securityID;
16+
}
17+
18+
public void setSecurityID(String securityID) {
19+
this.securityID = securityID;
20+
}
21+
22+
public int getQuantity() {
23+
return quantity;
24+
}
25+
26+
public void setQuantity(int quantity) {
27+
this.quantity = quantity;
28+
}
29+
30+
public double getPrice() {
31+
return price;
32+
}
33+
34+
public void setPrice(double price) {
35+
this.price = price;
36+
}
37+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.baeldung.context.entity;
2+
3+
public class TradeDto {
4+
private String securityIdentifier;
5+
private int quantity;
6+
private double price;
7+
8+
public TradeDto() {
9+
}
10+
11+
public TradeDto(String securityIdentifier, int quantity, double price) {
12+
this.securityIdentifier = securityIdentifier;
13+
this.quantity = quantity;
14+
this.price = price;
15+
}
16+
17+
public TradeDto(String SecurityIdentifier) {
18+
this.securityIdentifier = SecurityIdentifier;
19+
}
20+
21+
public String getSecurityIdentifier() {
22+
return securityIdentifier;
23+
}
24+
25+
public void setSecurityIdentifier(String securityIdentifier) {
26+
this.securityIdentifier = securityIdentifier;
27+
}
28+
29+
public int getQuantity() {
30+
return quantity;
31+
}
32+
33+
public void setQuantity(int quantity) {
34+
this.quantity = quantity;
35+
}
36+
37+
public double getPrice() {
38+
return price;
39+
}
40+
41+
public void setPrice(double price) {
42+
this.price = price;
43+
}
44+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.baeldung.context.mapper;
2+
3+
import org.mapstruct.Context;
4+
import org.mapstruct.Mapper;
5+
import org.mapstruct.Mapping;
6+
import org.mapstruct.factory.Mappers;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
9+
10+
import com.baeldung.context.entity.Trade;
11+
import com.baeldung.context.entity.TradeDto;
12+
import com.baeldung.context.service.TradeDtoFactory;
13+
14+
@Mapper(uses = TradeDtoFactory.class)
15+
public abstract class TradeMapperUsingObjectFactory {
16+
final Logger logger = LoggerFactory.getLogger(TradeMapperUsingObjectFactory.class);
17+
18+
public static TradeMapperUsingObjectFactory getInstance() {
19+
return Mappers.getMapper(TradeMapperUsingObjectFactory.class);
20+
}
21+
22+
protected abstract TradeDto toTradeDto(Trade trade, @Context String identifierType);
23+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.baeldung.context.mapper;
2+
3+
import org.mapstruct.AfterMapping;
4+
import org.mapstruct.Context;
5+
import org.mapstruct.Mapper;
6+
import org.mapstruct.MappingTarget;
7+
import org.mapstruct.factory.Mappers;
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
10+
11+
import com.baeldung.context.entity.Trade;
12+
import com.baeldung.context.entity.TradeDto;
13+
import com.baeldung.context.service.SecurityService;
14+
15+
@Mapper
16+
public abstract class TradeMapperWithAfterMapping {
17+
final Logger logger = LoggerFactory.getLogger(TradeMapperWithAfterMapping.class);
18+
19+
public static TradeMapperWithAfterMapping getInstance() {
20+
return Mappers.getMapper(TradeMapperWithAfterMapping.class);
21+
}
22+
23+
protected abstract TradeDto toTradeDto(Trade trade, @Context String identifierType);
24+
25+
@AfterMapping
26+
protected TradeDto convertToIdentifier(Trade trade, @MappingTarget TradeDto tradeDto, @Context String identifierType) {
27+
logger.info("convertToIdentifier(): Converting to identifier type: {}", identifierType);
28+
SecurityService securityService = new SecurityService();
29+
tradeDto.setSecurityIdentifier(securityService.getSecurityIdentifierOfType(trade.getSecurityID(), identifierType));
30+
return tradeDto;
31+
}
32+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.baeldung.context.mapper;
2+
3+
import org.mapstruct.BeforeMapping;
4+
import org.mapstruct.Context;
5+
import org.mapstruct.Mapper;
6+
import org.mapstruct.Mapping;
7+
import org.mapstruct.factory.Mappers;
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
10+
11+
import com.baeldung.context.entity.Trade;
12+
import com.baeldung.context.entity.TradeDto;
13+
import com.baeldung.context.service.SecurityService;
14+
15+
@Mapper
16+
public abstract class TradeMapperWithBeforeMapping {
17+
final Logger logger = LoggerFactory.getLogger(TradeMapperWithBeforeMapping.class);
18+
19+
protected SecurityService securityService;
20+
21+
public static TradeMapperWithBeforeMapping getInstance() {
22+
return Mappers.getMapper(TradeMapperWithBeforeMapping.class);
23+
}
24+
25+
@BeforeMapping
26+
protected void initialize(@Context Integer exchangeCode) {
27+
logger.info("initialize(): Initializing SecurityService with identifier type: {}", exchangeCode);
28+
securityService = new SecurityService(exchangeCode);
29+
}
30+
31+
@Mapping(target="securityIdentifier", expression = "java(securityService.getSecurityIdentifierOfType(trade.getSecurityID(), identifierType))")
32+
protected abstract TradeDto toTradeDto(Trade trade, @Context String identifierType, @Context Integer exchangeCode);
33+
34+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.baeldung.context.service;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
6+
public class SecurityService {
7+
8+
private final Logger logger = LoggerFactory.getLogger(SecurityService.class);
9+
10+
private Integer exchangeCode;
11+
12+
public SecurityService() {
13+
14+
}
15+
16+
public SecurityService(Integer exchangeCode) {
17+
logger.info("SecurityService initialized with identifier type: {}", exchangeCode);
18+
}
19+
20+
public String getSecurityIdentifierOfType(String securityID, String identifierType) {
21+
// Simulate fetching security details from a database or external service
22+
logger.info("Fetching {} for security ID: {}", identifierType, securityID);
23+
24+
return switch (identifierType.toUpperCase()) {
25+
case "ISIN" -> "US0378331005";
26+
case "CUSIP" -> "037833100";
27+
case "SEDOL" -> "B1Y8QX7";
28+
default -> null;
29+
};
30+
}
31+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.baeldung.context.service;
2+
3+
import org.mapstruct.Context;
4+
import org.mapstruct.ObjectFactory;
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
7+
8+
import com.baeldung.context.entity.Trade;
9+
import com.baeldung.context.entity.TradeDto;
10+
11+
public class TradeDtoFactory {
12+
private static final Logger logger = LoggerFactory.getLogger(TradeDtoFactory.class);
13+
14+
@ObjectFactory
15+
public TradeDto createTradeDto(Trade trade, @Context String identifierType) {
16+
logger.info("createTradeDto(): Creating TradeDto with identifier type: {}", identifierType);
17+
SecurityService securityService = new SecurityService();
18+
String securityIdentifier = securityService.getSecurityIdentifierOfType(trade.getSecurityID(), identifierType);
19+
TradeDto tradeDto = new TradeDto(securityIdentifier);
20+
return tradeDto;
21+
}
22+
}
23+
24+
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.baeldung.context.mapper;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import org.junit.jupiter.api.Test;
6+
7+
import com.baeldung.context.entity.Trade;
8+
import com.baeldung.context.entity.TradeDto;
9+
10+
public class MapperContextUnitTest {
11+
@Test
12+
void givenBeforeMappingMethod_whenSecurityIdInTradeObject_thenSetSecurityIdentifierInTradeDto() {
13+
Trade trade = createTradeObject();
14+
15+
TradeDto tradeDto = TradeMapperWithBeforeMapping.getInstance()
16+
.toTradeDto(trade, "CUSIP", 6464);
17+
18+
assertEquals("037833100", tradeDto.getSecurityIdentifier());
19+
}
20+
21+
@Test
22+
void givenAfterMappingMethod_whenSecurityIdInTradeObject_thenSetSecurityIdentifierInTradeDto() {
23+
Trade trade = createTradeObject();
24+
25+
TradeDto tradeDto = TradeMapperWithAfterMapping.getInstance()
26+
.toTradeDto(trade, "CUSIP");
27+
28+
assertEquals("037833100", tradeDto.getSecurityIdentifier());
29+
}
30+
31+
@Test
32+
void whenGivenSecurityIDInTradeObject_thenUseObjectFactoryToCreateTradeDto() {
33+
Trade trade = createTradeObject();
34+
35+
TradeDto tradeDto = TradeMapperUsingObjectFactory.getInstance()
36+
.toTradeDto(trade, "SEDOL");
37+
38+
assertEquals("B1Y8QX7", tradeDto.getSecurityIdentifier());
39+
}
40+
41+
private Trade createTradeObject() {
42+
return new Trade("AAPL", 100, 150.0);
43+
}
44+
}

0 commit comments

Comments
 (0)