Skip to content

Commit 1f6979a

Browse files
author
Dennis Labordus
authored
Merge pull request #224 from com-pas/develop
New release
2 parents c415905 + 00a5859 commit 1f6979a

File tree

10 files changed

+138
-7
lines changed

10 files changed

+138
-7
lines changed

app/src/test/java/org/lfenergy/compas/scl/data/rest/mock/CompasSclDataRepositoryMock.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ public String findByUUID(SclFileType type, UUID id, Version version) {
4242
throw new IllegalStateException("Mock method using Mockito. Only needed to startup.");
4343
}
4444

45+
@Override
46+
public boolean hasDuplicateSclName(SclFileType type, String name) {
47+
throw new IllegalStateException("Mock method using Mockito. Only needed to startup.");
48+
}
49+
4550
@Override
4651
public void create(SclFileType type, UUID id, String name, String scl, Version version, String who) {
4752
throw new IllegalStateException("Mock method using Mockito. Only needed to startup.");

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ SPDX-License-Identifier: Apache-2.0
2626

2727
<compas.core.version>0.9.0</compas.core.version>
2828

29-
<quarkus.platform.version>2.9.0.Final</quarkus.platform.version>
29+
<quarkus.platform.version>2.9.2.Final</quarkus.platform.version>
3030
<jaxb-impl.version>2.3.6</jaxb-impl.version>
3131
<microprofile-openapi-api.version>3.0</microprofile-openapi-api.version>
3232
<slf4j.version>1.7.36</slf4j.version>

repository-basex/src/main/java/org/lfenergy/compas/scl/data/basex/repository/CompasSclDataBaseXRepository.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,11 @@ public String findByUUID(SclFileType type, UUID id, Version version) {
153153
return result.get(0);
154154
}
155155

156+
@Override
157+
public boolean hasDuplicateSclName(SclFileType type, String name) {
158+
return false;
159+
}
160+
156161
@Override
157162
public SclMetaInfo findMetaInfoByUUID(SclFileType type, UUID id) {
158163
// This find method always searches for the latest version.

repository-postgresql/src/main/java/org/lfenergy/compas/scl/data/repository/postgresql/CompasSclDataPostgreSQLRepository.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,29 @@ public String findByUUID(SclFileType type, UUID id, Version version) {
155155
}
156156
}
157157

158+
@Override
159+
public boolean hasDuplicateSclName(SclFileType type, String name) {
160+
var sql = "SELECT DISTINCT ON (id) * "
161+
+ FROM_CLAUSE
162+
+ "WHERE type=? "
163+
+ "ORDER BY id, major_version desc, minor_version desc, patch_version desc";
164+
165+
try (var connection = dataSource.getConnection();
166+
var stmt = connection.prepareStatement(sql)) {
167+
stmt.setString(1, type.name());
168+
169+
try (var resultSet = stmt.executeQuery()) {
170+
while (resultSet.next()) {
171+
var usedName = resultSet.getString(NAME_FIELD);
172+
if (usedName.equals(name)) return true;
173+
}
174+
}
175+
return false;
176+
} catch (SQLException exp) {
177+
throw new CompasSclDataServiceException(POSTGRES_SELECT_ERROR_CODE, "Error selecting latest versions from database!", exp);
178+
}
179+
}
180+
158181
@Override
159182
public SclMetaInfo findMetaInfoByUUID(SclFileType type, UUID id) {
160183
var sql = SELECT_METADATA_CLAUSE

repository-postgresql/src/test/java/org/lfenergy/compas/scl/data/repository/postgresql/CompasSclDataPostgreSQLRepositoryTest.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,17 @@
44
package org.lfenergy.compas.scl.data.repository.postgresql;
55

66
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.Test;
78
import org.junit.jupiter.api.extension.ExtendWith;
9+
import org.lfenergy.compas.scl.data.model.Version;
810
import org.lfenergy.compas.scl.data.repository.AbstractCompasSclDataRepository;
911
import org.lfenergy.compas.scl.data.repository.CompasSclDataRepository;
1012
import org.mockito.junit.jupiter.MockitoExtension;
1113

14+
import java.util.UUID;
15+
16+
import static org.junit.jupiter.api.Assertions.assertTrue;
17+
1218
@ExtendWith({MockitoExtension.class, PostgreSQLServerJUnitExtension.class})
1319
class CompasSclDataPostgreSQLRepositoryTest extends AbstractCompasSclDataRepository {
1420
private CompasSclDataPostgreSQLRepository repository;
@@ -22,4 +28,17 @@ protected CompasSclDataRepository getRepository() {
2228
void beforeEach() {
2329
repository = new CompasSclDataPostgreSQLRepository(PostgreSQLServerJUnitExtension.getDataSource());
2430
}
31+
32+
/*
33+
* TODO: Method beneath needs to be moved to AbstractCompasSclDataRepository
34+
* when hasDuplicateSclName has been implemented by CompasSclDataBaseXRepository. */
35+
@Test
36+
void hasDuplicateSclName_WhenUsingSclNameThatHasBeenUsedYet_ThenDuplicateIsFound() {
37+
var expectedVersion = new Version(1, 0, 0);
38+
var uuid = UUID.randomUUID();
39+
var scl = readSCL(uuid, expectedVersion, NAME_1);
40+
getRepository().create(TYPE, uuid, NAME_1, scl, expectedVersion, WHO);
41+
42+
assertTrue(getRepository().hasDuplicateSclName(TYPE, NAME_1));
43+
}
2544
}

repository/src/main/java/org/lfenergy/compas/scl/data/exception/CompasSclDataServiceErrorCode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class CompasSclDataServiceErrorCode {
1414
public static final String HEADER_NOT_FOUND_ERROR_CODE = "SDS-0004";
1515
public static final String NO_SCL_ELEMENT_FOUND_ERROR_CODE = "SDS-0005";
1616
public static final String NO_DATA_FOUND_ERROR_CODE = "SDS-0006";
17+
public static final String DUPLICATE_SCL_NAME_ERROR_CODE = "SDS-0007";
1718

1819
public static final String BASEX_CLIENT_CREATION_ERROR_CODE = "SDS-1000";
1920
public static final String BASEX_QUERY_ERROR_CODE = "SDS-1001";

repository/src/main/java/org/lfenergy/compas/scl/data/repository/CompasSclDataRepository.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,16 @@ public interface CompasSclDataRepository {
7070
@Transactional(SUPPORTS)
7171
String findByUUID(SclFileType type, UUID id, Version version);
7272

73+
/**
74+
* Return the specific version of a specific SCL Entry.
75+
*
76+
* @param type The type of SCL to search for the specific SCL.
77+
* @param name The name of the SCL used for checking duplicates.
78+
* @return True if name is already used by another SCL File of the same File type, otherwise false.
79+
*/
80+
@Transactional(SUPPORTS)
81+
boolean hasDuplicateSclName(SclFileType type, String name);
82+
7383
/**
7484
* Create a new entry for the passed UUID with the version number passed.
7585
* <p>

repository/src/test/java/org/lfenergy/compas/scl/data/repository/AbstractCompasSclDataRepository.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@
1616

1717
import static org.junit.jupiter.api.Assertions.*;
1818
import static org.lfenergy.compas.scl.data.SclDataServiceConstants.*;
19-
import static org.lfenergy.compas.scl.data.exception.CompasSclDataServiceErrorCode.HEADER_NOT_FOUND_ERROR_CODE;
20-
import static org.lfenergy.compas.scl.data.exception.CompasSclDataServiceErrorCode.NO_DATA_FOUND_ERROR_CODE;
19+
import static org.lfenergy.compas.scl.data.exception.CompasSclDataServiceErrorCode.*;
2120

2221
public abstract class AbstractCompasSclDataRepository {
2322
protected static final SclFileType TYPE = SclFileType.SCD;
@@ -180,6 +179,16 @@ void findByUUIDWithVersion_WhenTwoVersionsOfARecordAdded_ThenCorrectRecordIsFoun
180179
assertEquals(expectedVersion.toString(), getVersionFromHeader(foundScl));
181180
}
182181

182+
@Test
183+
void hasDuplicateSclName_WhenUsingSclNameThatHasNotBeenUsedYet_ThenNoDuplicateIsFound() {
184+
var expectedVersion = new Version(1, 0, 0);
185+
var uuid = UUID.randomUUID();
186+
var scl = readSCL(uuid, expectedVersion, NAME_1);
187+
getRepository().create(TYPE, uuid, NAME_1, scl, expectedVersion, WHO);
188+
189+
assertFalse(getRepository().hasDuplicateSclName(TYPE, "Some other name"));
190+
}
191+
183192
@Test
184193
void findMetaInfoByUUID_WhenTwoVersionsOfARecordAdded_ThenLastRecordIsFound() {
185194
var version = new Version(1, 0, 0);
@@ -320,7 +329,7 @@ private String getVersionFromHeader(String sclData) {
320329
.orElse("");
321330
}
322331

323-
private String readSCL(UUID uuid, Version version, String name) {
332+
protected String readSCL(UUID uuid, Version version, String name) {
324333
var inputStream = getClass().getResourceAsStream("/scl/scl.scd");
325334
assert inputStream != null;
326335

service/src/main/java/org/lfenergy/compas/scl/data/service/impl/CompasSclDataServiceImpl.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import static javax.transaction.Transactional.TxType.REQUIRED;
2828
import static javax.transaction.Transactional.TxType.SUPPORTS;
2929
import static org.lfenergy.compas.scl.data.SclDataServiceConstants.*;
30+
import static org.lfenergy.compas.scl.data.exception.CompasSclDataServiceErrorCode.DUPLICATE_SCL_NAME_ERROR_CODE;
3031
import static org.lfenergy.compas.scl.data.exception.CompasSclDataServiceErrorCode.NO_SCL_ELEMENT_FOUND_ERROR_CODE;
3132

3233
/**
@@ -120,6 +121,10 @@ public String create(SclFileType type, String name, String who, String comment,
120121
throw new CompasException(NO_SCL_ELEMENT_FOUND_ERROR_CODE, "No valid SCL found in the passed SCL Data.");
121122
}
122123

124+
if (repository.hasDuplicateSclName(type, name)) {
125+
throw new CompasException(DUPLICATE_SCL_NAME_ERROR_CODE, "Given name of SCL File already used.");
126+
}
127+
123128
// A unique ID is generated to store it under.
124129
var id = UUID.randomUUID();
125130
// When the SCL is created the version will be set to 1.0.0
@@ -158,6 +163,14 @@ public String update(SclFileType type, UUID id, ChangeSetType changeSetType, Str
158163
}
159164

160165
var currentSclMetaInfo = repository.findMetaInfoByUUID(type, id);
166+
var newFileName = getFilenameFromXML(scl);
167+
168+
if (newFileName.isPresent()
169+
&& !newFileName.get().equals(currentSclMetaInfo.getName())
170+
&& repository.hasDuplicateSclName(type, newFileName.get())) {
171+
throw new CompasException(DUPLICATE_SCL_NAME_ERROR_CODE, "Given name of SCL File already used.");
172+
}
173+
161174
// We always add a new version to the database, so add version record to the SCL and create a new record.
162175
var version = new Version(currentSclMetaInfo.getVersion());
163176
version = version.getNextVersion(changeSetType);
@@ -167,7 +180,7 @@ public String update(SclFileType type, UUID id, ChangeSetType changeSetType, Str
167180
createHistoryItem(header, "SCL updated", who, comment, version);
168181

169182
// Update or add the Compas Private Element to the SCL File.
170-
var newSclName = getFilenameFromXML(scl).orElse(currentSclMetaInfo.getName());
183+
var newSclName = newFileName.orElse(currentSclMetaInfo.getName());
171184
setSclCompasPrivateElement(scl, newSclName, type);
172185

173186
var newSclData = converter.convertToString(scl);

service/src/test/java/org/lfenergy/compas/scl/data/service/impl/CompasSclDataServiceImplTest.java

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@
3030
import static java.util.Collections.emptyList;
3131
import static org.junit.jupiter.api.Assertions.*;
3232
import static org.lfenergy.compas.scl.data.SclDataServiceConstants.*;
33-
import static org.lfenergy.compas.scl.data.exception.CompasSclDataServiceErrorCode.NO_DATA_FOUND_ERROR_CODE;
34-
import static org.lfenergy.compas.scl.data.exception.CompasSclDataServiceErrorCode.NO_SCL_ELEMENT_FOUND_ERROR_CODE;
33+
import static org.lfenergy.compas.scl.data.exception.CompasSclDataServiceErrorCode.*;
3534
import static org.mockito.Mockito.*;
3635

3736
@ExtendWith(MockitoExtension.class)
@@ -119,6 +118,7 @@ void create_WhenCalledWithOutCompasExtension_ThenSCLReturnedWithCorrectCompasExt
119118

120119
var scl = readSCL();
121120

121+
when(compasSclDataRepository.hasDuplicateSclName(SCL_TYPE, name)).thenReturn(false);
122122
doNothing().when(compasSclDataRepository).create(eq(SCL_TYPE), any(UUID.class), eq(name), anyString(), eq(INITIAL_VERSION), eq(who));
123123

124124
scl = compasSclDataService.create(SCL_TYPE, name, who, comment, scl);
@@ -127,6 +127,7 @@ void create_WhenCalledWithOutCompasExtension_ThenSCLReturnedWithCorrectCompasExt
127127
assertCompasExtenions(scl, name);
128128
assertHistoryItem(scl, INITIAL_VERSION, comment);
129129
verify(compasSclDataRepository, times(1)).create(eq(SCL_TYPE), any(UUID.class), eq(name), anyString(), eq(INITIAL_VERSION), eq(who));
130+
verify(compasSclDataRepository, times(1)).hasDuplicateSclName(SCL_TYPE, name);
130131
}
131132

132133
@Test
@@ -138,6 +139,7 @@ void create_WhenCalledWithCompasExtension_ThenSCLReturnedWithCorrectCompasExtens
138139
var scl = readSCL();
139140
scl = createCompasPrivate(scl, "JUSTANOTHERNAME");
140141

142+
when(compasSclDataRepository.hasDuplicateSclName(SCL_TYPE, name)).thenReturn(false);
141143
doNothing().when(compasSclDataRepository).create(eq(SCL_TYPE), any(UUID.class), eq(name), anyString(), eq(INITIAL_VERSION), eq(who));
142144

143145
scl = compasSclDataService.create(SCL_TYPE, name, who, comment, scl);
@@ -146,6 +148,23 @@ void create_WhenCalledWithCompasExtension_ThenSCLReturnedWithCorrectCompasExtens
146148
assertCompasExtenions(scl, name);
147149
assertHistoryItem(scl, INITIAL_VERSION, comment);
148150
verify(compasSclDataRepository, times(1)).create(eq(SCL_TYPE), any(UUID.class), eq(name), anyString(), eq(INITIAL_VERSION), eq(who));
151+
verify(compasSclDataRepository, times(1)).hasDuplicateSclName(SCL_TYPE, name);
152+
}
153+
154+
@Test
155+
void create_WhenCalledWithDuplicateSclName_ThenCompasExceptionThrown() throws IOException {
156+
var name = "JUSTSOMENAME";
157+
var comment = "";
158+
var who = "User A";
159+
160+
var scl = readSCL();
161+
162+
when(compasSclDataRepository.hasDuplicateSclName(SCL_TYPE, name)).thenReturn(true);
163+
var exception = assertThrows(CompasException.class, () -> {
164+
compasSclDataService.create(SCL_TYPE, name, who, comment, scl);
165+
});
166+
assertEquals(DUPLICATE_SCL_NAME_ERROR_CODE, exception.getErrorCode());
167+
verify(compasSclDataRepository, times(1)).hasDuplicateSclName(SCL_TYPE, name);
149168
}
150169

151170
@Test
@@ -183,6 +202,7 @@ void update_WhenCalledWithoutCompasElements_ThenSCLReturnedWithCorrectCompasExte
183202
assertHistoryItem(scl, nextVersion, null);
184203
verify(compasSclDataRepository, times(1)).create(eq(SCL_TYPE), eq(uuid), eq(previousName), anyString(), eq(nextVersion), eq(who));
185204
verify(compasSclDataRepository, times(1)).findMetaInfoByUUID(SCL_TYPE, uuid);
205+
verify(compasSclDataRepository, never()).hasDuplicateSclName(SCL_TYPE, previousName);
186206
}
187207

188208
@Test
@@ -200,6 +220,7 @@ void update_WhenCalledWithCompasElementsAndNewName_ThenSCLReturnedWithCorrectCom
200220
var sclMetaInfo = new SclMetaInfo(uuid.toString(), previousName, INITIAL_VERSION.toString());
201221
when(compasSclDataRepository.findMetaInfoByUUID(SCL_TYPE, uuid)).thenReturn(sclMetaInfo);
202222
doNothing().when(compasSclDataRepository).create(eq(SCL_TYPE), eq(uuid), eq(newName), anyString(), eq(nextVersion), eq(who));
223+
when(compasSclDataRepository.hasDuplicateSclName(SCL_TYPE, newName)).thenReturn(false);
203224

204225
scl = compasSclDataService.update(SCL_TYPE, uuid, changeSet, who, null, scl);
205226

@@ -208,6 +229,30 @@ void update_WhenCalledWithCompasElementsAndNewName_ThenSCLReturnedWithCorrectCom
208229
assertHistoryItem(scl, nextVersion, null);
209230
verify(compasSclDataRepository, times(1)).create(eq(SCL_TYPE), eq(uuid), eq(newName), anyString(), eq(nextVersion), eq(who));
210231
verify(compasSclDataRepository, times(1)).findMetaInfoByUUID(SCL_TYPE, uuid);
232+
verify(compasSclDataRepository, times(1)).hasDuplicateSclName(SCL_TYPE, newName);
233+
}
234+
235+
@Test
236+
void update_WhenCalledWithCompasElementsAndDuplicateNewName_ThenCompasExceptionThrown() throws IOException {
237+
var previousName = "Previous SCL Filename";
238+
var newName = "New SCL Filename";
239+
var uuid = UUID.randomUUID();
240+
var changeSet = ChangeSetType.MAJOR;
241+
var who = "User A";
242+
var nextVersion = INITIAL_VERSION.getNextVersion(changeSet);
243+
244+
var scl = createCompasPrivate(readSCL(), newName);
245+
246+
var sclMetaInfo = new SclMetaInfo(uuid.toString(), previousName, INITIAL_VERSION.toString());
247+
when(compasSclDataRepository.findMetaInfoByUUID(SCL_TYPE, uuid)).thenReturn(sclMetaInfo);
248+
when(compasSclDataRepository.hasDuplicateSclName(SCL_TYPE, newName)).thenReturn(true);
249+
250+
var exception = assertThrows(CompasException.class, () -> {
251+
compasSclDataService.update(SCL_TYPE, uuid, changeSet, who, null, scl);
252+
});
253+
assertEquals(DUPLICATE_SCL_NAME_ERROR_CODE, exception.getErrorCode());
254+
verify(compasSclDataRepository, times(1)).findMetaInfoByUUID(SCL_TYPE, uuid);
255+
verify(compasSclDataRepository, times(1)).hasDuplicateSclName(SCL_TYPE, newName);
211256
}
212257

213258
@Test
@@ -232,6 +277,7 @@ void update_WhenCalledWithCompasElementsAndSameName_ThenSCLReturnedWithCorrectCo
232277
assertHistoryItem(scl, nextVersion, null);
233278
verify(compasSclDataRepository, times(1)).create(eq(SCL_TYPE), eq(uuid), eq(previousName), anyString(), eq(nextVersion), eq(who));
234279
verify(compasSclDataRepository, times(1)).findMetaInfoByUUID(SCL_TYPE, uuid);
280+
verify(compasSclDataRepository, never()).hasDuplicateSclName(SCL_TYPE, previousName);
235281
}
236282

237283
@Test

0 commit comments

Comments
 (0)