diff --git a/discovery-frontend/src/app/dataconnection/service/dataconnection.service.ts b/discovery-frontend/src/app/dataconnection/service/dataconnection.service.ts index 650103831e..f11144ef61 100644 --- a/discovery-frontend/src/app/dataconnection/service/dataconnection.service.ts +++ b/discovery-frontend/src/app/dataconnection/service/dataconnection.service.ts @@ -91,6 +91,35 @@ export class DataconnectionService extends AbstractService { return this.get(url); } // function - getDatabases + /** + * Get database list in connection + * @param {string} connectionId + * @param params + * @returns {Promise} + */ + public getDatabaseListInConnection(connectionId: string, params: any): Promise { + let url: string = this.API_URL + `connections/${connectionId}/databases`; + if (params) { + url += '?' + CommonUtil.objectToUrlString(params); + } + return this.get(url); + } + + /** + * Get table list in connection + * @param {string} connectionId + * @param {string} databaseName + * @param params + * @returns {Promise} + */ + public getTableListInConnection(connectionId: string, databaseName: string, params: any): Promise { + let url: string = this.API_URL + `connections/${connectionId}/databases/${databaseName}/tables`; + if (params) { + url += '?' + CommonUtil.objectToUrlString(params); + } + return this.get(url); + } + // 커넥션 정보로만 데이터베이스 조회 public getDatabasesWithoutId(param: any): Promise { return this.post(this.API_URL + 'connections/query/databases', param); @@ -123,17 +152,6 @@ export class DataconnectionService extends AbstractService { return this.post(this.API_URL + 'connections/query/data', param); } - // 데이터 테이블 조회 -> 이름으로 - public getSearchTables(connectionId: string, databaseName: string, tableName: string, page?:Page): Promise { - let url = this.API_URL + `connections/${connectionId}/databases/${databaseName}/tables?tableName=${tableName}`; - - if (page) { - url += '&' + CommonUtil.objectToUrlString(page); - } - - return this.get(url); - } - // 커넥션 상태 조회 public checkConnection(param: any) : Promise { return this.post(this.API_URL + 'connections/query/check', param); diff --git a/discovery-frontend/src/app/workbench/component/detail-workbench/detail-workbench-database/detail-workbench-database.ts b/discovery-frontend/src/app/workbench/component/detail-workbench/detail-workbench-database/detail-workbench-database.ts index 9268275ca8..b09331ea4a 100644 --- a/discovery-frontend/src/app/workbench/component/detail-workbench/detail-workbench-database/detail-workbench-database.ts +++ b/discovery-frontend/src/app/workbench/component/detail-workbench/detail-workbench-database/detail-workbench-database.ts @@ -28,6 +28,7 @@ import { isUndefined } from 'util'; import { Page } from '../../../../domain/common/page'; import { AbstractWorkbenchComponent } from '../../abstract-workbench.component'; import { WorkbenchService } from '../../../service/workbench.service'; +import { StringUtil } from '../../../../common/util/string.util'; @Component({ selector: 'detail-workbench-database', @@ -74,6 +75,9 @@ export class DetailWorkbenchDatabase extends AbstractWorkbenchComponent implemen @Output() public schemaBrowserEvent: EventEmitter = new EventEmitter(); + // request reconnect count + private _getDatabaseListReconnectCount: number = 0; + /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Constructor |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ @@ -137,15 +141,19 @@ export class DetailWorkbenchDatabase extends AbstractWorkbenchComponent implemen return; } + // 호출 횟수 증가 + this._getDatabaseListReconnectCount++; + this.loadingShow(); this.searchText = ( this.searchText ) ? this.searchText.trim().toLowerCase() : ''; this.page.page = pageNum; (0 === pageNum) && ( this.databases = [] ); - - this.dataconnectionService.getDatabases(this.params.dataconnection.id, this.page, this.searchText.toLowerCase()) + this.dataconnectionService.getDatabaseListInConnection(this.params.dataconnection.id, this._getParameterForDatabase(WorkbenchService.websocketId, this.page, this.searchText)) .then((data) => { + // 호출 횟수 초기화 + this._getDatabaseListReconnectCount = 0; if (data) { this.databases = this.databases.concat(data.databases); this.pageResult = data.page; @@ -166,22 +174,43 @@ export class DetailWorkbenchDatabase extends AbstractWorkbenchComponent implemen } this.loadingHide(); }) - .catch(error => this.commonExceptionHandler(error)); + .catch((error) => { + if (!isUndefined(error.details) && error.code === 'JDC0005' && this._getDatabaseListReconnectCount <= 5) { + this.webSocketCheck(() => { + this.getDatabase(pageNum, isSearch); + }); + } else { + this.commonExceptionHandler(error); + } + }); } // function - getDatabase - private _getDatabaseList(connectionId: string, page: Page, searchText: string): Promise { - return new Promise((resolve, reject) => { - this.dataconnectionService.getDatabases(connectionId, page, searchText.toLowerCase()) - .then((result) => { - resolve(result); - }) - .catch((error) => { - reject(error); - }); - }) + private _getDatabaseList(connectionId: string, page: Page, searchText: string): void { + // 호출 횟수 증가 + this._getDatabaseListReconnectCount++; + this.dataconnectionService.getDatabaseListInConnection(connectionId, this._getParameterForDatabase(WorkbenchService.websocketId, page, searchText)) + .then((result) => { + // 호출 횟수 초기화 + this._getDatabaseListReconnectCount = 0; + this.databases = result.databases; + this.pageResult = result.page; + this.loadingHide(); + }) + .catch((error) => { + if (!isUndefined(error.details) && error.code === 'JDC0005' && this._getDatabaseListReconnectCount <= 5) { + this.webSocketCheck(() => { + this._getDatabaseList(connectionId, page, searchText); + }); + } else { + this.commonExceptionHandler(error); + } + }); } + + + /** * 데이터베이스 이름 클릭했을 때 */ @@ -235,15 +264,7 @@ export class DetailWorkbenchDatabase extends AbstractWorkbenchComponent implemen this.page.page = 0; // TODO 데이터베이스 검색 this.loadingShow(); - this._getDatabaseList(this.params.dataconnection.id, this.page, this.searchText.toLowerCase()) - .then((result) => { - this.databases = result.databases; - this.pageResult = result.page; - this.loadingHide(); - }) - .catch((error) => { - this.commonExceptionHandler(error); - }); + this._getDatabaseList(this.params.dataconnection.id, this.page, this.searchText.toLowerCase()); } /** @@ -328,4 +349,26 @@ export class DetailWorkbenchDatabase extends AbstractWorkbenchComponent implemen | Private Method |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + /** + * Get parameters for database list + * @param {string} webSocketId + * @param {Page} page + * @param {string} databaseName + * @returns {any} + * @private + */ + private _getParameterForDatabase(webSocketId: string, page?: Page, databaseName?: string): any { + const params = { + webSocketId: webSocketId + }; + if (page) { + params['sort'] = page.sort; + params['page'] = page.page; + params['size'] = page.size; + } + if (StringUtil.isNotEmpty(databaseName)) { + params['databaseName'] = databaseName.trim(); + } + return params; + } } diff --git a/discovery-frontend/src/app/workbench/component/detail-workbench/detail-workbench-schema-browser/detail-workbench-schema-browser.component.ts b/discovery-frontend/src/app/workbench/component/detail-workbench/detail-workbench-schema-browser/detail-workbench-schema-browser.component.ts index 79df84a870..e5f68cc31d 100644 --- a/discovery-frontend/src/app/workbench/component/detail-workbench/detail-workbench-schema-browser/detail-workbench-schema-browser.component.ts +++ b/discovery-frontend/src/app/workbench/component/detail-workbench/detail-workbench-schema-browser/detail-workbench-schema-browser.component.ts @@ -31,6 +31,7 @@ import { MetadataService } from '../../../../meta-data-management/metadata/servi import * as _ from 'lodash'; import { isUndefined } from 'util'; import { AbstractWorkbenchComponent } from '../../abstract-workbench.component'; +import { StringUtil } from '../../../../common/util/string.util'; @Component({ selector: 'detail-workbench-schema-browser', @@ -77,6 +78,9 @@ export class DetailWorkbenchSchemaBrowserComponent extends AbstractWorkbenchComp private _getMetaDataReconnectCount: number = 0; private _getSingleQueryReconnectCount: number = 0; private _getTableDetailDataReconnectCount: number = 0; + private _getDatabaseListReconnectCount: number = 0; + private _getTableListReconnectCount: number = 0; + /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Protected Variables |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ @@ -244,17 +248,7 @@ export class DetailWorkbenchSchemaBrowserComponent extends AbstractWorkbenchComp // 로딩 show this.loadingShow(); // 테이블 목록 조회 요청 - this._getSearchTablesForServer(this.dataConnection.id, this.selectedDatabaseName, page) - .then((result) => { - // table이 있는 경우 - if (result['tables']) { - // 스키마 테이블 리스트 저장 - this.schemaTableList = result['tables']; - // 테이블에 연결된 메타데이터 목록 조회 - this._getTableMetaDataList(result['tables']); - } - }) - .catch(error => this.commonExceptionHandler(error)); + this._getSearchTablesForServer(this.dataConnection.id, this.selectedDatabaseName, page); } /** @@ -526,12 +520,16 @@ export class DetailWorkbenchSchemaBrowserComponent extends AbstractWorkbenchComp * @private */ private _getDatabaseList(searchFl: boolean = false): void { + // 호출 횟수 증가 + this._getDatabaseListReconnectCount++; // 로딩 show this.loadingShow(); // 데이터베이스 조회 - this.connectionService.getDatabases(this.dataConnection.id, this.page, this.searchDatabaseText) + this.connectionService.getDatabaseListInConnection(this.dataConnection.id, this._getParameterForDatabase(WorkbenchService.websocketId, this.page, this.searchDatabaseText)) .then((data) => { if (data) { + // 호출 횟수 초기화 + this._getDatabaseListReconnectCount = 0; // 데이터베이스 리스트 this.databaseList = this.databaseList.concat(data.databases); // 페이지 객체 @@ -542,7 +540,13 @@ export class DetailWorkbenchSchemaBrowserComponent extends AbstractWorkbenchComp searchFl ? this.loadingHide() : this.getTableList(); }) .catch((error) => { - this.commonExceptionHandler(error); + if (!isUndefined(error.details) && error.code === 'JDC0005' && this._getDatabaseListReconnectCount <= 5) { + this.webSocketCheck(() => { + this._getDatabaseList(searchFl); + }); + } else { + this.commonExceptionHandler(error); + } }); } @@ -552,25 +556,36 @@ export class DetailWorkbenchSchemaBrowserComponent extends AbstractWorkbenchComp * @param {string} databaseName * @param {Page} page * @param {string} tableName - * @returns {Promise} * @private */ - private _getSearchTablesForServer(connectionId: string, databaseName: string, page:Page, tableName: string = ''): Promise { - return new Promise((resolve, reject) => { - // 로딩 show - this.loadingShow(); - this.connectionService.getSearchTables(connectionId, databaseName, tableName, page) - .then((result) => { - // 로딩 hide - this.loadingHide(); - resolve(result); - }) - .catch((error) => { - // 로딩 hide - this.loadingHide(); - reject(error); - }); - }); + private _getSearchTablesForServer(connectionId: string, databaseName: string, page:Page, tableName: string = ''): void { + // 호출 횟수 증가 + this._getTableListReconnectCount++; + // 로딩 show + this.loadingShow(); + this.connectionService.getTableListInConnection(connectionId, databaseName, this._getParameterForTable(WorkbenchService.websocketId, page, tableName)) + .then((result) => { + // 호출 횟수 초기화 + this._getTableListReconnectCount = 0; + // 로딩 hide + this.loadingHide(); + // table이 있는 경우 + if (result['tables']) { + // 스키마 테이블 리스트 저장 + this.schemaTableList = result['tables']; + // 테이블에 연결된 메타데이터 목록 조회 + this._getTableMetaDataList(result['tables']); + } + }) + .catch((error) => { + if (!isUndefined(error.details) && error.code === 'JDC0005' && this._getTableListReconnectCount <= 5) { + this.webSocketCheck(() => { + this._getSearchTablesForServer(connectionId, databaseName, page, tableName); + }); + } else { + this.commonExceptionHandler(error); + } + }); } /** @@ -1032,4 +1047,51 @@ export class DetailWorkbenchSchemaBrowserComponent extends AbstractWorkbenchComp private _searchGridComponent(gridComponent: GridComponent, searchText: string): void { gridComponent.search(searchText); } + + /** + * Get parameters for database list + * @param {string} webSocketId + * @param {Page} page + * @param {string} databaseName + * @returns {any} + * @private + */ + private _getParameterForDatabase(webSocketId: string, page?: Page, databaseName?: string): any { + const params = { + webSocketId: webSocketId + }; + if (page) { + params['sort'] = page.sort; + params['page'] = page.page; + params['size'] = page.size; + } + if (StringUtil.isNotEmpty(databaseName)) { + params['databaseName'] = databaseName.trim(); + } + return params; + } + + /** + * Get parameter for table + * @param {string} webSocketId + * @param {Page} page + * @param {string} tableName + * @returns {any} + * @private + */ + private _getParameterForTable(webSocketId: string, page?: Page, tableName?: string): any { + const params = { + webSocketId: webSocketId + }; + if (page) { + params['sort'] = page.sort; + params['page'] = page.page; + params['size'] = page.size; + } + if (StringUtil.isNotEmpty(tableName)) { + params['tableName'] = tableName.trim(); + } + return params; + } + } diff --git a/discovery-frontend/src/app/workbench/component/detail-workbench/detail-workbench-table/detail-workbench-table.ts b/discovery-frontend/src/app/workbench/component/detail-workbench/detail-workbench-table/detail-workbench-table.ts index f979d53f09..0e8bd3b6f6 100644 --- a/discovery-frontend/src/app/workbench/component/detail-workbench/detail-workbench-table/detail-workbench-table.ts +++ b/discovery-frontend/src/app/workbench/component/detail-workbench/detail-workbench-table/detail-workbench-table.ts @@ -25,17 +25,19 @@ import { Output, ViewChild } from '@angular/core'; -import { AbstractComponent } from '../../../../common/component/abstract.component'; import { DataconnectionService } from '../../../../dataconnection/service/dataconnection.service'; -import { Dataconnection } from '../../../../domain/dataconnection/dataconnection'; import { isUndefined } from 'util'; import { Alert } from '../../../../common/util/alert.util'; +import { Page } from '../../../../domain/common/page'; +import { StringUtil } from '../../../../common/util/string.util'; +import { AbstractWorkbenchComponent } from '../../abstract-workbench.component'; +import { WorkbenchService } from '../../../service/workbench.service'; @Component({ selector: 'detail-workbench-table', templateUrl: './detail-workbench-table.html', }) -export class DetailWorkbenchTable extends AbstractComponent implements OnInit, OnDestroy, OnChanges { +export class DetailWorkbenchTable extends AbstractWorkbenchComponent implements OnInit, OnDestroy, OnChanges { /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Private Variables @@ -97,15 +99,19 @@ export class DetailWorkbenchTable extends AbstractComponent implements OnInit, O public localData: any[] = []; + // request reconnect count + private _getTableListReconnectCount: number = 0; + /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | Constructor |-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ // 생성자 - constructor(protected dataconnectionService: DataconnectionService, + constructor(protected workbenchService: WorkbenchService, + protected dataconnectionService: DataconnectionService, protected element: ElementRef, protected injector: Injector) { - super(element, injector); + super(workbenchService, element, injector); } /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= @@ -170,9 +176,16 @@ export class DetailWorkbenchTable extends AbstractComponent implements OnInit, O if (this.page.page === 0) { this.tables = []; } + + // 호출 횟수 증가 + this._getTableListReconnectCount++; + this.loadingShow(); - this.dataconnectionService.getSearchTables(this.inputParams.dataconnection.id, this.inputParams.dataconnection.database, this.searchText, this.page) + this.dataconnectionService.getTableListInConnection(this.inputParams.dataconnection.id, this.inputParams.dataconnection.database, this._getParameterForTable(WorkbenchService.websocketId, this.page, this.searchText)) .then((data) => { + // 호출 횟수 초기화 + this._getTableListReconnectCount = 0; + this.loadingHide(); if (data['page']['totalPages'] === 1) { this.pageMode = 'MEMORY'; @@ -188,15 +201,17 @@ export class DetailWorkbenchTable extends AbstractComponent implements OnInit, O this.tableDataEvent.emit(data['tables']); }) .catch((error) => { - this.loadingHide(); - if (!isUndefined(error.details)) { - Alert.error(error.details); + if (!isUndefined(error.details) && error.code === 'JDC0005' && this._getTableListReconnectCount <= 5) { + this.webSocketCheck(() => { + this.getTables(); + }); } else { - Alert.error(error); + this.commonExceptionHandler(error); } }); } + /** * 이전버튼 disable 여부 * @returns {boolean} @@ -237,22 +252,38 @@ export class DetailWorkbenchTable extends AbstractComponent implements OnInit, O } this.page.page = this.page.page - 1; } + // set table list + this._setTableList(this.inputParams.dataconnection.id, this.inputParams.dataconnection.database); + } + + /** + * Set table list + * @param {string} connectionId + * @param {string} databaseName + * @private + */ + private _setTableList(connectionId: string, databaseName: string): void { + // 호출 횟수 증가 + this._getTableListReconnectCount++; this.loadingShow(); - this.dataconnectionService.getSearchTables(this.inputParams.dataconnection.id, this.inputParams.dataconnection.database, this.searchText, this.page) + this.dataconnectionService.getTableListInConnection(connectionId, databaseName, this._getParameterForTable(WorkbenchService.websocketId, this.page, this.searchText)) .then((data) => { + // 호출 횟수 초기화 + this._getTableListReconnectCount = 0; + this.loadingHide(); this.pageResult = data['page']; this.tables = data['tables']; }) .catch((error) => { - this.loadingHide(); - if (!isUndefined(error.details)) { - Alert.error(error.details); + if (!isUndefined(error.details) && error.code === 'JDC0005' && this._getTableListReconnectCount <= 5) { + this.webSocketCheck(() => { + this._setTableList(connectionId, databaseName); + }); } else { - Alert.error(error); + this.commonExceptionHandler(error); } - }); } @@ -283,7 +314,7 @@ export class DetailWorkbenchTable extends AbstractComponent implements OnInit, O selectedTable: item, // top:offset.top, top: 250, - websocketId: this.inputParams.webSocketId + websocketId: WorkbenchService.websocketId }; } @@ -299,7 +330,7 @@ export class DetailWorkbenchTable extends AbstractComponent implements OnInit, O dataconnection: this.inputParams.dataconnection, selectedTable: item, top: 250, - websocketId: this.inputParams.webSocketId + websocketId: WorkbenchService.websocketId }; } @@ -344,4 +375,26 @@ export class DetailWorkbenchTable extends AbstractComponent implements OnInit, O this.getTables(); } + /** + * Get parameter for table + * @param {string} webSocketId + * @param {Page} page + * @param {string} tableName + * @returns {any} + * @private + */ + private _getParameterForTable(webSocketId: string, page?: Page, tableName?: string): any { + const params = { + webSocketId: webSocketId + }; + if (page) { + params['sort'] = page.sort; + params['page'] = page.page; + params['size'] = page.size; + } + if (StringUtil.isNotEmpty(tableName)) { + params['tableName'] = tableName.trim(); + } + return params; + } }