Skip to content

Commit

Permalink
IJMP-1923 Fixed adding invalid connections from Zowe config file
Browse files Browse the repository at this point in the history
Signed-off-by: Katsiaryna Tsytsenia <[email protected]>
  • Loading branch information
Katsiaryna Tsytsenia authored and Katsiaryna Tsytsenia committed Nov 13, 2024
1 parent d742a64 commit 4d091b8
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 89 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -189,8 +189,8 @@ class ZoweConfigServiceImpl(override val myProject: Project) : ZoweConfigService

/**
* Added notification about connection failure with action of force connection adding.
* @param title - notification title.
* @param content - notification content.
* @param title notification title.
* @param content notification content.
* @return Nothing.
*/
private fun notifyUiOnConnectionFailure(title: String, content: String, type: ZoweConfigType) {
Expand Down Expand Up @@ -258,27 +258,23 @@ class ZoweConfigServiceImpl(override val myProject: Project) : ZoweConfigService
this.globalZoweConfig
zoweConfig ?: throw Exception("Cannot get $type Zowe config")

var allPreparedConn = mutableListOf<ConnectionConfig>()
if (checkConnection) {
val failedURLs = mutableListOf<String>()
allPreparedConn = testAndPrepareAllZosmfConnections(zoweConfig, type, failedURLs)
if (failedURLs.isNotEmpty()) {
val andMore = if (failedURLs.size > 3)
"..."
else
""
notifyUiOnConnectionFailure(
"Connection failed to:",
"${failedURLs.joinToString(separator = ", <p>")} ${andMore}",
type
)
return
}
val (allPreparedConn, failedConnections) = testAndPrepareAllZosmfConnections(zoweConfig, type)
if (checkConnection and failedConnections.isNotEmpty()) {
val andMore = if (failedConnections.size > 3) "..." else ""
notifyUiOnConnectionFailure(
"Connection failed to:",
"${failedConnections.map{it.url}.joinToString(separator = ", <p>")} $andMore",
type
)
}
for (zosmfConnection in allPreparedConn) {
val conToAdd = if (checkConnection)
allPreparedConn.subtract(failedConnections.toSet())
else
allPreparedConn
conToAdd.forEach { zosmfConnection ->
val connectionOpt = configCrudable.addOrUpdate(zosmfConnection)
if (!connectionOpt.isEmpty) {
var topic = if (type == ZoweConfigType.LOCAL)
val topic = if (type == ZoweConfigType.LOCAL)
LOCAL_ZOWE_CONFIG_CHANGED
else
GLOBAL_ZOWE_CONFIG_CHANGED
Expand All @@ -300,9 +296,9 @@ class ZoweConfigServiceImpl(override val myProject: Project) : ZoweConfigService
private fun prepareConnection(zosmfConnection: ZOSConnection, type: ZoweConfigType): ConnectionConfig {
val username = zosmfConnection.user
val password = zosmfConnection.password
val zoweConnection = findExistingConnection(type, zosmfConnection.profileName)?.let {
zosmfConnection.toConnectionConfig(it.uuid, it.zVersion, type = type)
} ?: zosmfConnection.toConnectionConfig(UUID.randomUUID().toString(), type = type)
val zoweConnection = findExistingConnection(type, zosmfConnection.profileName)
?.let { zosmfConnection.toConnectionConfig(it.uuid, it.zVersion, type = type) }
?: zosmfConnection.toConnectionConfig(UUID.randomUUID().toString(), type = type)
CredentialService.getService().setCredentials(zoweConnection.uuid, username, password)
return zoweConnection
}
Expand All @@ -311,24 +307,25 @@ class ZoweConfigServiceImpl(override val myProject: Project) : ZoweConfigService
* Convert all zosmf connections from zowe config file to ConnectionConfig and tests them
* @param zoweConfig
* @param type of zowe config
* @return list of URLs which did not pass the test
* @return pair of lists, one is the connections list, the second is the list of URLs which did not pass the test
*/
private fun testAndPrepareAllZosmfConnections(
zoweConfig: ZoweConfig,
type: ZoweConfigType,
failedURLs: MutableList<String>
): MutableList<ConnectionConfig> {
var allPreparedConn = mutableListOf<ConnectionConfig>()
for (zosmfConnection in zoweConfig.getListOfZosmfConections()) {
val zoweConnection = prepareConnection(zosmfConnection, type)
try {
testAndPrepareConnection(zoweConnection)
} catch (t: Throwable) {
failedURLs.add(zoweConnection.url)
type: ZoweConfigType
): Pair<List<ConnectionConfig>, List<ConnectionConfig>> {
return zoweConfig.getListOfZosmfConections()
.fold(
mutableListOf<ConnectionConfig>() to mutableListOf<ConnectionConfig>()
) { (allConnectionConfigs, failedURLs), zosmfConnection ->
val zoweConnection = prepareConnection(zosmfConnection, type)
try {
testAndPrepareConnection(zoweConnection)
} catch (t: Throwable) {
failedURLs.add(zoweConnection)
}
allConnectionConfigs.add(zoweConnection)
allConnectionConfigs to failedURLs
}
allPreparedConn.add(zoweConnection)
}
return allPreparedConn
}

/**
Expand Down Expand Up @@ -415,18 +412,20 @@ class ZoweConfigServiceImpl(override val myProject: Project) : ZoweConfigService
val allConnections = configCrudable.getAll<ConnectionConfig>().toList()
val allConnectionsNames: MutableList<String> = allConnections.map { it.name }.toMutableList()

allConnections.filter { it.zoweConfigPath == getZoweConfigLocation(myProject, type) }.forEach {
var index = 1
var newName = it.name
while (allConnectionsNames.contains(newName)) {
newName = it.name.plus(index.toString())
index++
allConnections
.filter { it.zoweConfigPath == getZoweConfigLocation(myProject, type) }
.forEach {
var index = 1
var newName = it.name
while (allConnectionsNames.contains(newName)) {
newName = it.name.plus(index.toString())
index++
}
allConnectionsNames.add(newName)
it.name = newName
it.zoweConfigPath = null
configCrudable.update(it)
}
allConnectionsNames.add(newName)
it.name = newName
it.zoweConfigPath = null
configCrudable.update(it)
}
}

private fun createZoweSchemaJsonIfNotExists() {
Expand Down Expand Up @@ -479,39 +478,37 @@ class ZoweConfigServiceImpl(override val myProject: Project) : ZoweConfigService
globalZoweConfig ?: return ZoweConfigState.NOT_EXISTS

findAllZosmfExistingConnection(type) ?: return ZoweConfigState.NEED_TO_ADD
var ret = ZoweConfigState.SYNCHRONIZED

for (zosConnection in zoweConfig.getListOfZosmfConections()) {
val existingConnection =
findExistingConnection(type, zosConnection.profileName)
if (existingConnection == null)
ret = setZoweConfigState(ret, ZoweConfigState.NEED_TO_ADD)
else {
val newConnectionList = zoweConfig.getListOfZosmfConections()
.filter { it.profileName == getProfileNameFromConnName(existingConnection.name) }
val newConnection = if (newConnectionList.isNotEmpty()) {
newConnectionList[0].toConnectionConfig(
existingConnection.uuid.toString(), existingConnection.zVersion, existingConnection.owner, type = type
)
} else {
ret = setZoweConfigState(ret, ZoweConfigState.NEED_TO_ADD)
continue
}
val zoweUsername = zosConnection.user
val zowePassword = zosConnection.password

ret = if (
existingConnection == newConnection
&& CredentialService.getUsername(newConnection) == zoweUsername
&& CredentialService.getPassword(newConnection) == zowePassword
) {
setZoweConfigState(ret, ZoweConfigState.SYNCHRONIZED)

return zoweConfig
.getListOfZosmfConections()
.fold(ZoweConfigState.SYNCHRONIZED) { prevZoweConfigState, zosConnection ->
val existingConnection = findExistingConnection(type, zosConnection.profileName)
val currZoweConfigState = if (existingConnection == null) {
ZoweConfigState.NEED_TO_ADD
} else {
setZoweConfigState(ret, ZoweConfigState.NEED_TO_UPDATE)
val newConnectionList = zoweConfig.getListOfZosmfConections()
.filter { it.profileName == getProfileNameFromConnName(existingConnection.name) }
if (newConnectionList.isNotEmpty()) {
val newConnection = newConnectionList[0].toConnectionConfig(
existingConnection.uuid, existingConnection.zVersion, existingConnection.owner, type = type
)
val zoweUsername = zosConnection.user
val zowePassword = zosConnection.password
if (
existingConnection == newConnection
&& CredentialService.getUsername(newConnection) == zoweUsername
&& CredentialService.getPassword(newConnection) == zowePassword
) {
ZoweConfigState.SYNCHRONIZED
} else {
ZoweConfigState.NEED_TO_UPDATE
}
} else {
ZoweConfigState.NEED_TO_ADD
}
}
setZoweConfigState(prevZoweConfigState, currZoweConfigState)
}
}
return ret
}

/**
Expand Down
24 changes: 13 additions & 11 deletions src/test/kotlin/org/zowe/explorer/config/ZoweConfigTestSpec.kt
Original file line number Diff line number Diff line change
Expand Up @@ -346,7 +346,6 @@ class ZoweConfigTestSpec : WithApplicationShouldSpec({
isInputStreamCalled shouldBe true
isReturnedZoweConfig shouldBe true
isScanForZoweConfigCalled shouldBe true
isZOSInfoCalled shouldBe false
}

should("delete zowe team config connection") {
Expand Down Expand Up @@ -377,20 +376,23 @@ class ZoweConfigTestSpec : WithApplicationShouldSpec({
j = true
listOf(jWSConf).stream()
}
var isShowOkCancelDialogCalled = false
val showOkCancelDialogMock: (String, String, String, String, Icon?) -> Int = ::showOkCancelDialog
mockkStatic(showOkCancelDialogMock as KFunction<*>)
every {
showOkCancelDialogMock(any<String>(), any<String>(), any<String>(), any<String>(), any())
} answers {
isShowOkCancelDialogCalled = true
Messages.OK
val notificationsService = NotificationsService.getService() as TestNotificationsServiceImpl
notificationsService.testInstance = object : TestNotificationsServiceImpl() {
override fun notifyError(
t: Throwable,
project: Project?,
custTitle: String?,
custDetailsShort: String?,
custDetailsLong: String?
) {
notified = true
}
}
mockedZoweConfigService.deleteZoweConfig(type = ZoweConfigType.LOCAL)

f shouldBe true
j shouldBe true
isShowOkCancelDialogCalled shouldBe true
notified shouldBe true
isConnectionDeleted shouldBe false
}

Expand Down Expand Up @@ -741,4 +743,4 @@ class ZoweConfigTestSpec : WithApplicationShouldSpec({

}

})
})

0 comments on commit 4d091b8

Please sign in to comment.