Skip to content

Commit 406b3c0

Browse files
dfcoffinclaude
andauthored
refactor: Phase 7 - ServiceDeliveryPoint ESPI 4.0 schema compliance (#73)
Per ESPI 4.0 specification, ServiceDeliveryPoint extends Object (not IdentifiedObject), so it has NO Atom metadata fields. This phase aligns the DTO, mapper, and repository with the XSD definition. Changes: - ServiceDeliveryPointDto: Remove id/uuid fields (Object type has no mRID) - ServiceDeliveryPointDto: Update propOrder to match XSD sequence (name, tariffProfile, customerAgreement, tariffRiderRefs) - ServiceDeliveryPointMapper: Remove id/uuid mappings, add explicit XSD element mappings - ServiceDeliveryPointMapper: Remove updateEntity method (read-only operations) - ServiceDeliveryPointRepository: Keep only indexed query (findAllIds) - ServiceDeliveryPointRepositoryTest: Remove tests for deleted custom queries All 536 tests pass. Entity already matches XSD structure correctly. Co-authored-by: Claude Sonnet 4.5 <[email protected]>
1 parent 7a25404 commit 406b3c0

File tree

4 files changed

+22
-211
lines changed

4 files changed

+22
-211
lines changed

openespi-common/src/main/java/org/greenbuttonalliance/espi/common/dto/usage/ServiceDeliveryPointDto.java

Lines changed: 13 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -34,40 +34,18 @@
3434
@XmlRootElement(name = "ServiceDeliveryPoint", namespace = "http://naesb.org/espi")
3535
@XmlAccessorType(XmlAccessType.PROPERTY)
3636
@XmlType(name = "ServiceDeliveryPoint", namespace = "http://naesb.org/espi", propOrder = {
37-
"description", "name", "tariffProfile", "customerAgreement", "tariffRiderRefs"
37+
"name", "tariffProfile", "customerAgreement", "tariffRiderRefs"
3838
})
3939
public record ServiceDeliveryPointDto(
40-
41-
Long id,
42-
String uuid,
43-
String description,
40+
4441
String name,
4542
String tariffProfile,
4643
String customerAgreement,
4744
TariffRiderRefsDto tariffRiderRefs
4845
) {
49-
50-
@XmlTransient
51-
public Long getId() {
52-
return id;
53-
}
54-
55-
@XmlAttribute(name = "mRID")
56-
public String getUuid() {
57-
return uuid;
58-
}
59-
60-
/**
61-
* Human-readable description of the service delivery point.
62-
* Typically describes the location or purpose of the delivery point.
63-
*/
64-
@XmlElement(name = "description")
65-
public String getDescription() {
66-
return description;
67-
}
68-
46+
6947
/**
70-
* The name is any free human readable and possibly non unique text
48+
* The name is any free human readable and possibly non unique text
7149
* naming the service delivery point object.
7250
*/
7351
@XmlElement(name = "name")
@@ -106,35 +84,27 @@ public TariffRiderRefsDto getTariffRiderRefs() {
10684
* Default constructor for JAXB.
10785
*/
10886
public ServiceDeliveryPointDto() {
109-
this(null, null, null, null, null, null, null);
87+
this(null, null, null, null);
11088
}
111-
89+
11290
/**
11391
* Minimal constructor for basic service delivery point data.
11492
*/
115-
public ServiceDeliveryPointDto(String uuid, String name) {
116-
this(null, uuid, null, name, null, null, null);
93+
public ServiceDeliveryPointDto(String name) {
94+
this(name, null, null, null);
11795
}
118-
119-
/**
120-
* Constructor with full service delivery point information.
121-
*/
122-
public ServiceDeliveryPointDto(String uuid, String name, String tariffProfile,
123-
String customerAgreement, TariffRiderRefsDto tariffRiderRefs) {
124-
this(null, uuid, null, name, tariffProfile, customerAgreement, tariffRiderRefs);
125-
}
126-
96+
12797
/**
12898
* Gets a display name for this service delivery point.
12999
* Uses the name if available, otherwise creates a default display name.
130-
*
100+
*
131101
* @return display name string
132102
*/
133103
public String getDisplayName() {
134104
if (name != null && !name.trim().isEmpty()) {
135105
return name.trim();
136106
}
137-
return "Service Delivery Point " + (uuid != null ? uuid : "Unknown");
107+
return "Service Delivery Point (Unknown)";
138108
}
139109

140110
/**
@@ -196,17 +166,13 @@ public boolean isValid() {
196166

197167
/**
198168
* Creates a residential service delivery point with common settings.
199-
*
200-
* @param uuid unique identifier
169+
*
201170
* @param name display name
202171
* @param customerAgreement customer agreement reference
203172
* @return ServiceDeliveryPoint with residential configuration
204173
*/
205-
public static ServiceDeliveryPointDto createResidential(String uuid, String name, String customerAgreement) {
174+
public static ServiceDeliveryPointDto createResidential(String name, String customerAgreement) {
206175
return new ServiceDeliveryPointDto(
207-
null,
208-
uuid,
209-
"Residential electric service delivery point",
210176
name,
211177
"RESIDENTIAL_TOU",
212178
customerAgreement,

openespi-common/src/main/java/org/greenbuttonalliance/espi/common/mapper/usage/ServiceDeliveryPointMapper.java

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import org.greenbuttonalliance.espi.common.dto.usage.ServiceDeliveryPointDto;
2424
import org.mapstruct.Mapper;
2525
import org.mapstruct.Mapping;
26-
import org.mapstruct.MappingTarget;
2726

2827
/**
2928
* MapStruct mapper for converting between ServiceDeliveryPointEntity and ServiceDeliveryPointDto.
@@ -39,15 +38,15 @@ public interface ServiceDeliveryPointMapper {
3938

4039
/**
4140
* Converts a ServiceDeliveryPointEntity to a ServiceDeliveryPointDto.
42-
* Maps service delivery point attributes per ESPI 4.0 XSD.
41+
* Maps service delivery point attributes per ESPI 4.0 XSD element sequence.
4342
*
4443
* @param entity the service delivery point entity
4544
* @return the service delivery point DTO
4645
*/
47-
@Mapping(target = "id", ignore = true)
48-
@Mapping(target = "uuid", ignore = true) // No mRID in entity or XSD
49-
@Mapping(target = "description", ignore = true) // Not in XSD for ServiceDeliveryPoint
50-
@Mapping(target = "tariffRiderRefs", ignore = true) // Relationship handled separately
46+
@Mapping(target = "name", source = "name")
47+
@Mapping(target = "tariffProfile", source = "tariffProfile")
48+
@Mapping(target = "customerAgreement", source = "customerAgreement")
49+
@Mapping(target = "tariffRiderRefs", ignore = true) // XML-only field, not persisted in entity
5150
ServiceDeliveryPointDto toDto(ServiceDeliveryPointEntity entity);
5251

5352
/**
@@ -57,16 +56,9 @@ public interface ServiceDeliveryPointMapper {
5756
* @param dto the service delivery point DTO
5857
* @return the service delivery point entity
5958
*/
60-
@Mapping(target = "id", ignore = true)
59+
@Mapping(target = "id", ignore = true) // Auto-generated primary key
60+
@Mapping(target = "name", source = "name")
61+
@Mapping(target = "tariffProfile", source = "tariffProfile")
62+
@Mapping(target = "customerAgreement", source = "customerAgreement")
6163
ServiceDeliveryPointEntity toEntity(ServiceDeliveryPointDto dto);
62-
63-
/**
64-
* Updates an existing ServiceDeliveryPointEntity with data from a ServiceDeliveryPointDto.
65-
* Useful for merge operations where entity values need to be updated.
66-
*
67-
* @param dto the source DTO
68-
* @param entity the target entity to update
69-
*/
70-
@Mapping(target = "id", ignore = true)
71-
void updateEntity(ServiceDeliveryPointDto dto, @MappingTarget ServiceDeliveryPointEntity entity);
7264
}

openespi-common/src/main/java/org/greenbuttonalliance/espi/common/repositories/usage/ServiceDeliveryPointRepository.java

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -21,41 +21,15 @@
2121

2222
import org.greenbuttonalliance.espi.common.domain.usage.ServiceDeliveryPointEntity;
2323
import org.springframework.data.jpa.repository.JpaRepository;
24-
import org.springframework.data.jpa.repository.Modifying;
2524
import org.springframework.data.jpa.repository.Query;
26-
import org.springframework.data.repository.query.Param;
2725
import org.springframework.stereotype.Repository;
28-
import org.springframework.transaction.annotation.Transactional;
2926

3027
import java.util.List;
3128

3229
@Repository
3330
public interface ServiceDeliveryPointRepository extends JpaRepository<ServiceDeliveryPointEntity, Long> {
3431

35-
// JpaRepository provides: save(), findById(), findAll(), deleteById(), etc.
36-
37-
@Modifying
38-
@Transactional
39-
@Query("DELETE FROM ServiceDeliveryPointEntity s WHERE s.id = :id")
40-
void deleteById(@Param("id") Long id);
41-
4232
@Query("SELECT s.id FROM ServiceDeliveryPointEntity s")
4333
List<Long> findAllIds();
4434

45-
@Query("SELECT s FROM ServiceDeliveryPointEntity s WHERE s.name = :name")
46-
List<ServiceDeliveryPointEntity> findByName(@Param("name") String name);
47-
48-
@Query("SELECT s FROM ServiceDeliveryPointEntity s WHERE s.tariffProfile = :tariffProfile")
49-
List<ServiceDeliveryPointEntity> findByTariffProfile(@Param("tariffProfile") String tariffProfile);
50-
51-
@Query("SELECT s FROM ServiceDeliveryPointEntity s WHERE s.customerAgreement = :customerAgreement")
52-
List<ServiceDeliveryPointEntity> findByCustomerAgreement(@Param("customerAgreement") String customerAgreement);
53-
54-
@Query("SELECT s FROM ServiceDeliveryPointEntity s WHERE LOWER(s.name) LIKE LOWER(CONCAT('%', :searchText, '%'))")
55-
List<ServiceDeliveryPointEntity> findByNameContaining(@Param("searchText") String searchText);
56-
57-
// Additional utility methods
58-
@Query("SELECT COUNT(s) FROM ServiceDeliveryPointEntity s WHERE s.tariffProfile = :tariffProfile")
59-
Long countByTariffProfile(@Param("tariffProfile") String tariffProfile);
60-
6135
}

openespi-common/src/test/java/org/greenbuttonalliance/espi/common/repositories/usage/ServiceDeliveryPointRepositoryTest.java

Lines changed: 0 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -172,127 +172,6 @@ void shouldCountServiceDeliveryPointsCorrectly() {
172172
@DisplayName("Custom Query Methods")
173173
class CustomQueryMethodsTest {
174174

175-
@Test
176-
@DisplayName("Should find service delivery points by name")
177-
void shouldFindServiceDeliveryPointsByName() {
178-
// Arrange
179-
ServiceDeliveryPointEntity sdp1 = createValidServiceDeliveryPoint();
180-
sdp1.setName("Unique Location Name");
181-
ServiceDeliveryPointEntity sdp2 = createValidServiceDeliveryPoint();
182-
sdp2.setName("Unique Location Name"); // Same name
183-
ServiceDeliveryPointEntity sdp3 = createValidServiceDeliveryPoint();
184-
sdp3.setName("Different Location Name");
185-
186-
persistAndFlush(sdp1);
187-
persistAndFlush(sdp2);
188-
persistAndFlush(sdp3);
189-
190-
// Act
191-
List<ServiceDeliveryPointEntity> sdps = serviceDeliveryPointRepository.findByName("Unique Location Name");
192-
193-
// Assert
194-
assertThat(sdps).hasSize(2);
195-
assertThat(sdps).extracting(ServiceDeliveryPointEntity::getName)
196-
.allMatch(name -> name.equals("Unique Location Name"));
197-
}
198-
199-
@Test
200-
@DisplayName("Should find service delivery points by tariff profile")
201-
void shouldFindServiceDeliveryPointsByTariffProfile() {
202-
// Arrange
203-
ServiceDeliveryPointEntity sdp1 = createValidServiceDeliveryPoint();
204-
sdp1.setTariffProfile("RESIDENTIAL-STANDARD");
205-
ServiceDeliveryPointEntity sdp2 = createValidServiceDeliveryPoint();
206-
sdp2.setTariffProfile("RESIDENTIAL-STANDARD"); // Same tariff
207-
ServiceDeliveryPointEntity sdp3 = createValidServiceDeliveryPoint();
208-
sdp3.setTariffProfile("COMMERCIAL-BASIC");
209-
210-
persistAndFlush(sdp1);
211-
persistAndFlush(sdp2);
212-
persistAndFlush(sdp3);
213-
214-
// Act
215-
List<ServiceDeliveryPointEntity> sdps = serviceDeliveryPointRepository.findByTariffProfile("RESIDENTIAL-STANDARD");
216-
217-
// Assert
218-
assertThat(sdps).hasSize(2);
219-
assertThat(sdps).extracting(ServiceDeliveryPointEntity::getTariffProfile)
220-
.allMatch(tariff -> tariff.equals("RESIDENTIAL-STANDARD"));
221-
}
222-
223-
@Test
224-
@DisplayName("Should find service delivery points by customer agreement")
225-
void shouldFindServiceDeliveryPointsByCustomerAgreement() {
226-
// Arrange
227-
ServiceDeliveryPointEntity sdp1 = createValidServiceDeliveryPoint();
228-
sdp1.setCustomerAgreement("AGREEMENT-12345");
229-
ServiceDeliveryPointEntity sdp2 = createValidServiceDeliveryPoint();
230-
sdp2.setCustomerAgreement("AGREEMENT-12345"); // Same agreement
231-
ServiceDeliveryPointEntity sdp3 = createValidServiceDeliveryPoint();
232-
sdp3.setCustomerAgreement("AGREEMENT-67890");
233-
234-
persistAndFlush(sdp1);
235-
persistAndFlush(sdp2);
236-
persistAndFlush(sdp3);
237-
238-
// Act
239-
List<ServiceDeliveryPointEntity> sdps = serviceDeliveryPointRepository.findByCustomerAgreement("AGREEMENT-12345");
240-
241-
// Assert
242-
assertThat(sdps).hasSize(2);
243-
assertThat(sdps).extracting(ServiceDeliveryPointEntity::getCustomerAgreement)
244-
.allMatch(agreement -> agreement.equals("AGREEMENT-12345"));
245-
}
246-
247-
@Test
248-
@DisplayName("Should find service delivery points by name containing text")
249-
void shouldFindServiceDeliveryPointsByNameContaining() {
250-
// Arrange
251-
ServiceDeliveryPointEntity sdp1 = createValidServiceDeliveryPoint();
252-
sdp1.setName("Main Street Office Building");
253-
ServiceDeliveryPointEntity sdp2 = createValidServiceDeliveryPoint();
254-
sdp2.setName("Oak Street Residential");
255-
ServiceDeliveryPointEntity sdp3 = createValidServiceDeliveryPoint();
256-
sdp3.setName("Pine Avenue Commercial");
257-
258-
persistAndFlush(sdp1);
259-
persistAndFlush(sdp2);
260-
persistAndFlush(sdp3);
261-
262-
// Act
263-
List<ServiceDeliveryPointEntity> sdps = serviceDeliveryPointRepository.findByNameContaining("Street");
264-
265-
// Assert
266-
assertThat(sdps).hasSize(2);
267-
assertThat(sdps).extracting(ServiceDeliveryPointEntity::getName)
268-
.allMatch(name -> name.toLowerCase().contains("street"));
269-
}
270-
271-
@Test
272-
@DisplayName("Should count service delivery points by tariff profile")
273-
void shouldCountServiceDeliveryPointsByTariffProfile() {
274-
// Arrange
275-
ServiceDeliveryPointEntity sdp1 = createValidServiceDeliveryPoint();
276-
sdp1.setTariffProfile("COMMERCIAL-PREMIUM");
277-
ServiceDeliveryPointEntity sdp2 = createValidServiceDeliveryPoint();
278-
sdp2.setTariffProfile("COMMERCIAL-PREMIUM");
279-
ServiceDeliveryPointEntity sdp3 = createValidServiceDeliveryPoint();
280-
sdp3.setTariffProfile("COMMERCIAL-PREMIUM");
281-
ServiceDeliveryPointEntity sdp4 = createValidServiceDeliveryPoint();
282-
sdp4.setTariffProfile("RESIDENTIAL-BASIC");
283-
284-
persistAndFlush(sdp1);
285-
persistAndFlush(sdp2);
286-
persistAndFlush(sdp3);
287-
persistAndFlush(sdp4);
288-
289-
// Act
290-
Long count = serviceDeliveryPointRepository.countByTariffProfile("COMMERCIAL-PREMIUM");
291-
292-
// Assert
293-
assertThat(count).isEqualTo(3L);
294-
}
295-
296175
@Test
297176
@DisplayName("Should find all IDs")
298177
void shouldFindAllIds() {

0 commit comments

Comments
 (0)