Skip to content
Snippets Groups Projects
Commit c0ff73a4 authored by Jan Zickermann's avatar Jan Zickermann
Browse files

OZG-4097 itcase: Use before each to restart mockservers

parent f3707d3d
1 merge request!15Ozg 4097 senden und empfangen von anhängen
Pipeline #1742 failed
package de.ozgcloud.nachrichten.postfach.osiv2;
import static com.github.tomakehurst.wiremock.client.WireMock.*;
import static de.ozgcloud.nachrichten.NachrichtenManagerConfiguration.*;
import static de.ozgcloud.nachrichten.postfach.osiv2.factory.JwtFactory.*;
import static org.assertj.core.api.Assertions.*;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.UUID;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
......@@ -13,10 +23,22 @@ import org.springframework.test.context.DynamicPropertySource;
import org.springframework.test.context.TestPropertySource;
import com.github.tomakehurst.wiremock.WireMockServer;
import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder;
import de.ozgcloud.nachrichten.postfach.PostfachMessageCode;
import de.ozgcloud.nachrichten.postfach.osiv2.attachment.Osi2AttachmentFileService;
import de.ozgcloud.nachrichten.postfach.osiv2.exception.Osi2PostfachException;
import de.ozgcloud.nachrichten.postfach.osiv2.extension.AttachmentExampleUploadUtil;
import de.ozgcloud.nachrichten.postfach.osiv2.extension.Jwt;
import de.ozgcloud.nachrichten.postfach.osiv2.extension.OsiMockServerExtension;
import de.ozgcloud.nachrichten.postfach.osiv2.extension.VorgangManagerServerExtension;
import de.ozgcloud.nachrichten.postfach.osiv2.factory.JsonUtil;
import de.ozgcloud.nachrichten.postfach.osiv2.factory.MessageExchangeReceiveMessagesResponseTestFactory;
import de.ozgcloud.nachrichten.postfach.osiv2.factory.MessageExchangeSendMessageResponseTestFactory;
import de.ozgcloud.nachrichten.postfach.osiv2.factory.PostfachNachrichtTestFactory;
import de.ozgcloud.nachrichten.postfach.osiv2.factory.V1ReplyMessageTestFactory;
import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.QuarantineFileResult;
import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.QuarantineStatus;
import lombok.SneakyThrows;
@SpringBootTest(classes = TestApplication.class)
......@@ -24,6 +46,7 @@ import lombok.SneakyThrows;
@TestPropertySource(properties = {
"ozgcloud.osiv2.proxy.enabled=false",
})
@ExtendWith(MockitoExtension.class)
class OsiPostfachRemoteServiceITCase {
@RegisterExtension
......@@ -55,4 +78,203 @@ class OsiPostfachRemoteServiceITCase {
public void setup() {
postfachFacadeMockServer = OSI_MOCK_SERVER_EXTENSION.getPostfachFacadeMockServer();
}
@DisplayName("should send request with jwt")
@Test
@SneakyThrows
void shouldSendRequestWithJwt() {
var postfachNachricht = PostfachNachrichtTestFactory.create();
mockSendResponse();
osiPostfachRemoteService.sendMessage(postfachNachricht);
var requests = postfachFacadeMockServer.findAll(
postRequestedFor(urlPathTemplate("/MessageExchange/v1/Send/{mailboxId}")));
assertThat(requests).hasSize(1);
var jwt = Jwt.parseAuthHeaderValue(requests.getFirst().getHeader("Authorization"));
assertThat(jwt.body().read("$.client_id", String.class)).isEqualTo(CLIENT_ID);
assertThat(jwt.body().read("$.aud", String.class)).isEqualTo(RESOURCE_URN);
}
@DisplayName("should send message with attachment")
@Test
void shouldSendMessageWithAttachment() {
var textFileId = AttachmentExampleUploadUtil.uploadTextFile(osi2AttachmentFileService);
postfachFacadeMockServer.stubFor(post(urlPathTemplate("/Quarantine/v1/Upload/Chunked"))
.willReturn(okJsonObj(QuarantineFileResult.builder()
.success(true)
.build()))
);
postfachFacadeMockServer.stubFor(get(urlPathTemplate("/Quarantine/v1/Upload/{guid}"))
.willReturn(okJsonObj(QuarantineStatus.SAFE))
);
var postfachNachrichtWithAttachment = PostfachNachrichtTestFactory.createBuilder()
.attachments(List.of(textFileId))
.build();
mockSendResponse();
osiPostfachRemoteService.sendMessage(postfachNachrichtWithAttachment);
postfachFacadeMockServer.verify(
exactly(1),
postRequestedFor(urlPathTemplate("/Quarantine/v1/Upload/Chunked"))
);
postfachFacadeMockServer.verify(
exactly(1),
postRequestedFor(urlPathTemplate("/Quarantine/v1/Upload/{guid}"))
);
postfachFacadeMockServer.verify(
exactly(1),
postRequestedFor(urlPathTemplate("/MessageExchange/v1/Send/{mailboxId}"))
);
}
@DisplayName("should throw postfach exception with connection error code")
@Test
void shouldThrowPostfachExceptionWithConnectionErrorCode() {
postfachFacadeMockServer.stop();
var postfachNachricht = PostfachNachrichtTestFactory.create();
assertThatThrownBy(() -> osiPostfachRemoteService.sendMessage(postfachNachricht))
.isInstanceOf(Osi2PostfachException.class)
.hasFieldOrPropertyWithValue("messageCode", PostfachMessageCode.SERVER_CONNECTION_FAILED_MESSAGE_CODE);
}
@DisplayName("should delete attachments on upload exception")
@Test
void shouldDeleteAttachmentsOnUploadException() {
var textFileId = AttachmentExampleUploadUtil.uploadTextFile(osi2AttachmentFileService);
postfachFacadeMockServer.stubFor(post(urlPathTemplate("/Quarantine/v1/Upload/Chunked"))
.willReturn(okJsonObj(QuarantineFileResult.builder()
.success(false)
.error("Upload failure")
.build()))
);
postfachFacadeMockServer.stubFor(delete(urlPathTemplate("/Quarantine/v1/Upload/{guid}"))
.willReturn(ok())
);
var postfachNachrichtWithAttachment = PostfachNachrichtTestFactory.createBuilder()
.attachments(List.of(textFileId))
.build();
try {
osiPostfachRemoteService.sendMessage(postfachNachrichtWithAttachment);
} catch (Osi2PostfachException e) {
// ignore
}
postfachFacadeMockServer.verify(
exactly(1),
deleteRequestedFor(urlPathTemplate("/Quarantine/v1/Upload/{guid}"))
);
}
@DisplayName("should delete attachments on scan exception")
@Test
void shouldDeleteAttachmentsOnScanException() {
var textFileId = AttachmentExampleUploadUtil.uploadTextFile(osi2AttachmentFileService);
postfachFacadeMockServer.stubFor(post(urlPathTemplate("/Quarantine/v1/Upload/Chunked"))
.willReturn(okJsonObj(QuarantineFileResult.builder()
.success(true)
.build()))
);
postfachFacadeMockServer.stubFor(get(urlPathTemplate("/Quarantine/v1/Upload/{guid}"))
.willReturn(okJsonObj(QuarantineStatus.UNSAFE))
);
postfachFacadeMockServer.stubFor(delete(urlPathTemplate("/Quarantine/v1/Upload/{guid}"))
.willReturn(ok())
);
var postfachNachrichtWithAttachment = PostfachNachrichtTestFactory.createBuilder()
.attachments(List.of(textFileId))
.build();
try {
osiPostfachRemoteService.sendMessage(postfachNachrichtWithAttachment);
} catch (Osi2PostfachException e) {
// ignore
}
postfachFacadeMockServer.verify(
exactly(1),
deleteRequestedFor(urlPathTemplate("/Quarantine/v1/Upload/{guid}"))
);
}
private void mockSendResponse() {
// Stub message send response (MessageExchangeApi::sendMessage)
postfachFacadeMockServer.stubFor(post(urlPathTemplate("/MessageExchange/v1/Send/{mailboxId}"))
.willReturn(
okJsonObj(
MessageExchangeSendMessageResponseTestFactory.create()
.messageId(UUID.randomUUID())
)
)
);
}
@DisplayName("should receive one messages")
@Test
@SneakyThrows
void shouldReceiveMessages() {
mockPostfachMessageAndResponse("00000000-0000-0000-0000-000000000000");
var messageList = osiPostfachRemoteService.getAllMessages().toList();
assertThat(messageList).hasSize(1);
}
@DisplayName("should receive two messages")
@Test
@SneakyThrows
void shouldReceiveTwoMessages() {
mockPostfachMessageAndResponse("00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000001");
var messageList = osiPostfachRemoteService.getAllMessages().toList();
assertThat(messageList).hasSize(2);
}
private void mockPostfachMessageAndResponse(final String... uuids) {
// Stub message listing response (MessageExchangeApi::receiveMessages)
postfachFacadeMockServer.stubFor(get(urlPathEqualTo("/MessageExchange/v1/Receive"))
.withQueryParam("take", equalTo("100"))
.withQueryParam("skip", equalTo("0"))
.willReturn(okJsonObj(MessageExchangeReceiveMessagesResponseTestFactory.create(uuids)))
);
for (String uuid : uuids) {
// Stub individual response for message (MessageExchangeApi::getMessage)
postfachFacadeMockServer.stubFor(get(urlPathTemplate("/MessageExchange/v1/Receive/{messageId}"))
.withPathParam("messageId", equalTo(uuid))
.willReturn(okJsonObj(
V1ReplyMessageTestFactory.create()
.messageBox(UUID.fromString(uuid))
.responseTime(OffsetDateTime.now())
))
);
}
}
private ResponseDefinitionBuilder okJsonObj(final Object body) {
return okJson(JsonUtil.toJson(body));
}
@DisplayName("should delete message")
@Test
@SneakyThrows
void shouldDeleteMessage() {
var messageId = "00000000-0000-0000-0000-000000000000";
// Stub delete message response (MessageExchangeApi::deleteMessage)
postfachFacadeMockServer.stubFor(delete(urlPathTemplate("/MessageExchange/v1/Delete/{messageId}"))
.willReturn(ok())
);
osiPostfachRemoteService.deleteMessage(messageId);
postfachFacadeMockServer.verify(
exactly(1),
deleteRequestedFor(urlPathTemplate("/MessageExchange/v1/Delete/{messageId}"))
.withPathParam("messageId", equalTo(messageId))
);
}
}
package de.ozgcloud.nachrichten.postfach.osiv2;
import static com.github.tomakehurst.wiremock.client.WireMock.*;
import static de.ozgcloud.nachrichten.postfach.osiv2.factory.JwtFactory.*;
import static org.assertj.core.api.Assertions.*;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.UUID;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder;
import de.ozgcloud.nachrichten.postfach.osiv2.exception.Osi2PostfachException;
import de.ozgcloud.nachrichten.postfach.osiv2.extension.AttachmentExampleUploadUtil;
import de.ozgcloud.nachrichten.postfach.osiv2.extension.Jwt;
import de.ozgcloud.nachrichten.postfach.osiv2.factory.JsonUtil;
import de.ozgcloud.nachrichten.postfach.osiv2.factory.MessageExchangeReceiveMessagesResponseTestFactory;
import de.ozgcloud.nachrichten.postfach.osiv2.factory.MessageExchangeSendMessageResponseTestFactory;
import de.ozgcloud.nachrichten.postfach.osiv2.factory.PostfachNachrichtTestFactory;
import de.ozgcloud.nachrichten.postfach.osiv2.factory.V1ReplyMessageTestFactory;
import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.QuarantineFileResult;
import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.QuarantineStatus;
import lombok.SneakyThrows;
class OsiPostfachRemoteServicePrimaryITCase extends OsiPostfachRemoteServiceITCase {
@DisplayName("should send request with jwt")
@Test
@SneakyThrows
void shouldSendRequestWithJwt() {
var postfachNachricht = PostfachNachrichtTestFactory.create();
mockSendResponse();
osiPostfachRemoteService.sendMessage(postfachNachricht);
var requests = postfachFacadeMockServer.findAll(
postRequestedFor(urlPathTemplate("/MessageExchange/v1/Send/{mailboxId}")));
assertThat(requests).hasSize(1);
var jwt = Jwt.parseAuthHeaderValue(requests.getFirst().getHeader("Authorization"));
assertThat(jwt.body().read("$.client_id", String.class)).isEqualTo(CLIENT_ID);
assertThat(jwt.body().read("$.aud", String.class)).isEqualTo(RESOURCE_URN);
}
@DisplayName("should send message with attachment")
@Test
void shouldSendMessageWithAttachment() {
var textFileId = AttachmentExampleUploadUtil.uploadTextFile(osi2AttachmentFileService);
postfachFacadeMockServer.stubFor(post(urlPathTemplate("/Quarantine/v1/Upload/Chunked"))
.willReturn(okJsonObj(QuarantineFileResult.builder()
.success(true)
.build()))
);
postfachFacadeMockServer.stubFor(get(urlPathTemplate("/Quarantine/v1/Upload/{guid}"))
.willReturn(okJsonObj(QuarantineStatus.SAFE))
);
var postfachNachrichtWithAttachment = PostfachNachrichtTestFactory.createBuilder()
.attachments(List.of(textFileId))
.build();
mockSendResponse();
osiPostfachRemoteService.sendMessage(postfachNachrichtWithAttachment);
postfachFacadeMockServer.verify(
exactly(1),
postRequestedFor(urlPathTemplate("/Quarantine/v1/Upload/Chunked"))
);
postfachFacadeMockServer.verify(
exactly(1),
postRequestedFor(urlPathTemplate("/Quarantine/v1/Upload/{guid}"))
);
postfachFacadeMockServer.verify(
exactly(1),
postRequestedFor(urlPathTemplate("/MessageExchange/v1/Send/{mailboxId}"))
);
}
@DisplayName("should delete attachments on upload exception")
@Test
void shouldDeleteAttachmentsOnUploadException() {
var textFileId = AttachmentExampleUploadUtil.uploadTextFile(osi2AttachmentFileService);
postfachFacadeMockServer.stubFor(post(urlPathTemplate("/Quarantine/v1/Upload/Chunked"))
.willReturn(okJsonObj(QuarantineFileResult.builder()
.success(false)
.error("Upload failure")
.build()))
);
postfachFacadeMockServer.stubFor(delete(urlPathTemplate("/Quarantine/v1/Upload/{guid}"))
.willReturn(ok())
);
var postfachNachrichtWithAttachment = PostfachNachrichtTestFactory.createBuilder()
.attachments(List.of(textFileId))
.build();
try {
osiPostfachRemoteService.sendMessage(postfachNachrichtWithAttachment);
} catch (Osi2PostfachException e) {
// ignore
}
postfachFacadeMockServer.verify(
exactly(1),
deleteRequestedFor(urlPathTemplate("/Quarantine/v1/Upload/{guid}"))
);
}
@DisplayName("should delete attachments on scan exception")
@Test
void shouldDeleteAttachmentsOnScanException() {
var textFileId = AttachmentExampleUploadUtil.uploadTextFile(osi2AttachmentFileService);
postfachFacadeMockServer.stubFor(post(urlPathTemplate("/Quarantine/v1/Upload/Chunked"))
.willReturn(okJsonObj(QuarantineFileResult.builder()
.success(true)
.build()))
);
postfachFacadeMockServer.stubFor(get(urlPathTemplate("/Quarantine/v1/Upload/{guid}"))
.willReturn(okJsonObj(QuarantineStatus.UNSAFE))
);
postfachFacadeMockServer.stubFor(delete(urlPathTemplate("/Quarantine/v1/Upload/{guid}"))
.willReturn(ok())
);
var postfachNachrichtWithAttachment = PostfachNachrichtTestFactory.createBuilder()
.attachments(List.of(textFileId))
.build();
try {
osiPostfachRemoteService.sendMessage(postfachNachrichtWithAttachment);
} catch (Osi2PostfachException e) {
// ignore
}
postfachFacadeMockServer.verify(
exactly(1),
deleteRequestedFor(urlPathTemplate("/Quarantine/v1/Upload/{guid}"))
);
}
private void mockSendResponse() {
// Stub message send response (MessageExchangeApi::sendMessage)
postfachFacadeMockServer.stubFor(post(urlPathTemplate("/MessageExchange/v1/Send/{mailboxId}"))
.willReturn(
okJsonObj(
MessageExchangeSendMessageResponseTestFactory.create()
.messageId(UUID.randomUUID())
)
)
);
}
@DisplayName("should receive one messages")
@Test
@SneakyThrows
void shouldReceiveMessages() {
mockPostfachMessageAndResponse("00000000-0000-0000-0000-000000000000");
var messageList = osiPostfachRemoteService.getAllMessages().toList();
assertThat(messageList).hasSize(1);
}
@DisplayName("should receive two messages")
@Test
@SneakyThrows
void shouldReceiveTwoMessages() {
mockPostfachMessageAndResponse("00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000001");
var messageList = osiPostfachRemoteService.getAllMessages().toList();
assertThat(messageList).hasSize(2);
}
private void mockPostfachMessageAndResponse(final String... uuids) {
// Stub message listing response (MessageExchangeApi::receiveMessages)
postfachFacadeMockServer.stubFor(get(urlPathEqualTo("/MessageExchange/v1/Receive"))
.withQueryParam("take", equalTo("100"))
.withQueryParam("skip", equalTo("0"))
.willReturn(okJsonObj(MessageExchangeReceiveMessagesResponseTestFactory.create(uuids)))
);
for (String uuid : uuids) {
// Stub individual response for message (MessageExchangeApi::getMessage)
postfachFacadeMockServer.stubFor(get(urlPathTemplate("/MessageExchange/v1/Receive/{messageId}"))
.withPathParam("messageId", equalTo(uuid))
.willReturn(okJsonObj(
V1ReplyMessageTestFactory.create()
.messageBox(UUID.fromString(uuid))
.responseTime(OffsetDateTime.now())
))
);
}
}
private ResponseDefinitionBuilder okJsonObj(final Object body) {
return okJson(JsonUtil.toJson(body));
}
@DisplayName("should delete message")
@Test
@SneakyThrows
void shouldDeleteMessage() {
var messageId = "00000000-0000-0000-0000-000000000000";
// Stub delete message response (MessageExchangeApi::deleteMessage)
postfachFacadeMockServer.stubFor(delete(urlPathTemplate("/MessageExchange/v1/Delete/{messageId}"))
.willReturn(ok())
);
osiPostfachRemoteService.deleteMessage(messageId);
postfachFacadeMockServer.verify(
exactly(1),
deleteRequestedFor(urlPathTemplate("/MessageExchange/v1/Delete/{messageId}"))
.withPathParam("messageId", equalTo(messageId))
);
}
}
package de.ozgcloud.nachrichten.postfach.osiv2;
import static org.assertj.core.api.Assertions.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import de.ozgcloud.nachrichten.postfach.PostfachMessageCode;
import de.ozgcloud.nachrichten.postfach.osiv2.exception.Osi2PostfachException;
import de.ozgcloud.nachrichten.postfach.osiv2.factory.PostfachNachrichtTestFactory;
class OsiPostfachRemoteServiceSecondaryITCase extends OsiPostfachRemoteServiceITCase {
@BeforeEach
void mock() {
// Stopping the mock server
// Note that a restarting the server will configure a new unknown port.
postfachFacadeMockServer.stop();
}
@DisplayName("should throw postfach exception with connection error code")
@Test
void shouldThrowPostfachExceptionWithConnectionErrorCode() {
var postfachNachricht = PostfachNachrichtTestFactory.create();
assertThatThrownBy(() -> osiPostfachRemoteService.sendMessage(postfachNachricht))
.isInstanceOf(Osi2PostfachException.class)
.hasFieldOrPropertyWithValue("messageCode", PostfachMessageCode.SERVER_CONNECTION_FAILED_MESSAGE_CODE);
}
}
......@@ -3,6 +3,10 @@ package de.ozgcloud.nachrichten.postfach.osiv2.extension;
import static com.github.tomakehurst.wiremock.client.WireMock.*;
import static de.ozgcloud.nachrichten.postfach.osiv2.factory.JwtFactory.*;
import java.util.Optional;
import jakarta.annotation.Nullable;
import org.junit.jupiter.api.extension.AfterAllCallback;
import org.junit.jupiter.api.extension.AfterEachCallback;
import org.junit.jupiter.api.extension.BeforeAllCallback;
......@@ -19,7 +23,7 @@ import lombok.extern.log4j.Log4j2;
@Log4j2
@Getter
@RequiredArgsConstructor
public class OsiMockServerExtension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback {
public class OsiMockServerExtension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback {
private WireMockServer serviceKontoMockServer;
private WireMockServer postfachFacadeMockServer;
......@@ -30,26 +34,36 @@ public class OsiMockServerExtension implements BeforeAllCallback, AfterAllCallba
setupServiceKontoMock();
}
@Override
public void afterEach(ExtensionContext context) {
postfachFacadeMockServer.resetAll();
serviceKontoMockServer.resetAll();
}
@Override
public void afterAll(ExtensionContext context) {
if (serviceKontoMockServer != null) {
serviceKontoMockServer.shutdown();
serviceKontoMockServer = null;
}
if (postfachFacadeMockServer != null) {
postfachFacadeMockServer.shutdown();
postfachFacadeMockServer = null;
}
}
private void setupPostfachFacadeMock() {
postfachFacadeMockServer = new WireMockServer(0);
postfachFacadeMockServer.start();
postfachFacadeMockServer = setupWiremockServer(postfachFacadeMockServer, 32813);
}
private void setupServiceKontoMock() {
serviceKontoMockServer = new WireMockServer(0);
serviceKontoMockServer.start();
serviceKontoMockServer = setupWiremockServer(serviceKontoMockServer, 32812);
}
private WireMockServer setupWiremockServer(@Nullable WireMockServer existingServer, int port) {
if (existingServer != null && existingServer.isRunning()) {
existingServer.resetAll();
return existingServer;
} else {
var server = new WireMockServer(port);
server.start();
return server;
}
}
public String getAccessTokenUrl() {
......@@ -57,11 +71,16 @@ public class OsiMockServerExtension implements BeforeAllCallback, AfterAllCallba
}
public String getPostfachFacadeUrl() {
return postfachFacadeMockServer.baseUrl();
return Optional.ofNullable(postfachFacadeMockServer)
.map(WireMockServer::baseUrl)
.orElseThrow(() -> new IllegalStateException("PostfachFacadeMockServer not initialized"));
}
@Override
public void beforeEach(ExtensionContext context) {
setupPostfachFacadeMock();
setupServiceKontoMock();
serviceKontoMockServer.stubFor(post("/access-token")
.withHeader("Content-Type", equalTo("application/x-www-form-urlencoded"))
.withFormParam("grant_type", equalTo("client_credentials"))
......
......@@ -30,8 +30,10 @@ public class VorgangManagerServerExtension implements BeforeAllCallback, AfterAl
@Override
public void beforeAll(ExtensionContext context) {
if (vorgangManagerContainer == null || mongoDBContainer == null) {
setupVorgangManager();
}
}
@SneakyThrows
private void setupVorgangManager() {
......@@ -64,9 +66,11 @@ public class VorgangManagerServerExtension implements BeforeAllCallback, AfterAl
public void afterAll(ExtensionContext context) {
if (mongoDBContainer != null) {
mongoDBContainer.stop();
mongoDBContainer = null;
}
if (vorgangManagerContainer != null) {
vorgangManagerContainer.stop();
vorgangManagerContainer = null;
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment