Is your feature request related to a problem? Please describe.
데이터소스 목록 화면에서 검색 기능의 강화하는 개선이 필요합니다.
Describe the solution you'd like
검색란의 필터링 기능을 추가하여 검색창의 기능을 개선하고자 합니다.
참고로 현재 깃허브에서는 이런방식을 이용하고 있습니다.

데이터소스를 시작으로 모든 관리자(MANAGEMENT, ADMINISTRATOR)에 해당 내용을 적용하려고 합니다.
각 부분은 별도의 이슈로 진행하고 해당 이슈는 데이터소스 목록 화면 변경부분 내용만 반영하도록 하겠습니다..
@kyungtaak 아래의 모습과 같이 초안을 정하였습니다. 기술적으로 문제가 없는지 확인부탁드립니다.

@kyungtaak @AnnieHwang
데이터소스 화면향으로 작업한 기획서 입니다.
공통 UI라 다른 케이스들도 검토 중이니, 완료되면 추가 정의서 공유하겠습니다.




@AnnieHwang 검색필터링 관련 디자인 공유드려요
가로 1200px안에 다 들어오기 빡빡해서 시간필터링을 셀렉박스로 고르거나 range 입력할수있게 넣었습니다

@AnnieHwang @minjung-cho
@kyungtaak @AnnieHwang 먼저 답변드립니다
@koeun222 @minjung-cho
올려주신 디자인과 기획서가 달라서 문의드립니다.
시간 필터는 created, modified 2가지 옵션이 아닌가요?
@ufoscw
처음에는 created, modified 2가지 옵션으로 제공되는것으로 고려되었습니다만, 현재 modified(updated) 날짜 반영이 되는 조건이 큰 의미가 없다고 판단해서 제거되었습니다.
(현재 updated 날짜가 반영이 되는 액션은 이름/정보등의 정보가 수정되었을때고, 데이터 자체의 정보(논리정보 등)이 수정되었을 경우 updated 날짜가 반영되지 않습니다.)
때문에 updated 옵션은 more나 advenced등에서 제공하고 전면에 노출될 필요는 없을듯 합니다.
기획서에 해당 내용 업데이트 하도록 하겠습니다.
@deidera08
최근 업데이트된, 최근 등록된의 "최근" 은 몇일인가요?
그리고 "최근 본" 조건으로는 검색이 힘듭니다.
@ufoscw
'최근 업데이트된', '최근 등록된', '최근 본' 의 옵션은 필터라기 보다는 정렬기능입니다.
때문에 최근의 조건에 날짜를 정의하지 않았습니다.
더불어 위 검색필터들은 본 데이터소스 화면뿐 아니라 글로벌 적용을 염두에 두고 있습니다.
"최근 본" 옵션은 논의하여 재고하도록 하겠습니다(실질적 의견주셔서 감사합니다 :)
@minjung-cho @AnnieHwang
CheckBox 타입일 경우는 모두 All 체크가 필요하지 않을까요?
그리고 CheckBox 타입의 목록형 검색 조건은 UI가 통일 되어도 되지 않을까요?
최상단은 텍스트 필터링, 바로 밑에는 All 버튼.
@brandon-wonjune
DataSource List Filter API 2개가 추가되었습니다.
(GET) /api/datasources/criteria
https://tde.sktelecom.com/wiki/display/METATRON/DataSource+v2#DataSourcev2-ListofDataSourceFilterCriterion
(GET) /api/datasources/criteria/{CriterionKey}
https://tde.sktelecom.com/wiki/display/METATRON/DataSource+v2#DataSourcev2-ListofDataSourceFilter
검색조건을 구성할때 1번 API를 사용하시면 되고, 실제 검색 조건 목록을 표시할때 2번 API를 사용하시면 됩니다.
변경된 파라미터로 호출가능한 목록 API는 작업 완료 후 다시 알려드릴게요.
@minjung-cho @AnnieHwang
CheckBox 타입일 경우는 모두 All 체크가 필요하지 않을까요?
그리고 CheckBox 타입의 목록형 검색 조건은 UI가 통일 되어도 되지 않을까요?
최상단은 텍스트 필터링, 바로 밑에는 All 버튼.
텍스트 필터링이 불필요한 것(e.g.Ingestion 타입)이 있어서 있는 것, 없는 것 두벌로 가는 것이 좋을 것 같습니다.
All에 대해서는 공통적으로 적용하겠습니다~




@brandon-wonjune
filter된 datasouce 목록 호출 API 입니다.
(POST) /api/datasources/filter(?page,size,projection)
https://tde.sktelecom.com/wiki/display/METATRON/DataSource+v2#DataSourcev2-ListofDataSourcewithfilter
@ufoscw
작업하면서 문의사항이 있습니다.
Q1
초기에 필터 목록을 조회할때 사용하는 api
api/datasources/criteria
를 사용할때 criterionKey가 'MORE'일때는 아래의 스크린샷을 표기하는것으로 이해했습니다.

여기서 'Filter'에 해당하는지 'Criteria'에 해당하는지는 어떤 값을 기준으로 판단하면 되나요?
Q2
세부사항 조회할때 사용하는 api
/api/datasources/criteria/{CriterionKey}
는 아래의 스크린샷의 목록을 조회할 때 사용하는 것으로 이해했는데

여기서 해당 목록 중, 'subTitle(ex.My group)'이 있는지 없는지 여부는 api내부의 'filters'가 있고 없고로 판단하면 될까요?
Q2-1
동일 api의 결과 중
목록의 'search'기능이 있는지 없는지는 단순히 CREATOR와 PUBLISH만 허용하는것으로 하면 되나요?
@brandon-wonjune
2-1. search 기능 여부는 속성을 하나 추가하도록 하겠습니다.
isSearchable
@ufoscw
2번에서 답변 주신것처럼 subCriteria가 있으면 서브타이틀이 있는것으로 하면은 가능은합니다.
그런데 filters와 subCriteria가 동일 뎁스에서 혼재되어 있는경우가 있나요?
@brandon-wonjune
현재 기획상에는 없습니다.
subCriteria의 criterionName이 없는경우와 비슷하다고 볼수 있겠네요.
@brandon-wonjune
DataSourceListCriterion에 "searchable" 속성이 추가되었습니다.
@ufoscw
Create time 중 아래 from 과 to가 있고없고는 어떤 방식으로 체크하면 되나요?

@brandon-wonjune
criterionType이 RANGE_DATETIME 인경우는 항상 from, to가 필요합니다.
UI상에서 Today나 Last 7 days 경우는 UI상에 from, to가 보여지지 않지만 실제 파라미터는 from, to로 만들어서 보내주세요.
@AnnieHwang @ufoscw data connection 까지 고려하여 작업 부탁드립니다. (제목도 변경 부탁드릴게요.)
@ufoscw 데이터소스, 데이터커넥션 및 데이터모니터링 관련 필터 항목을 올려드립니다. 노란색 항목이 default로 화면에 표출될 필터 항목입니다. 변경이 필요하시면 말씀부탁드립니다.

(아래 파일을 참고하세요)
FilterLists-181116.xlsx
@ufoscw
api 문의 드립니다.
Q1.
(POST) /api/datasources/filter(?page,size,projection)
이 api는 filter를 선택했을때만 적용되는건가요? 그리고 projection은 기존것과 동일하게 쓰면되나요?
Q2. 만약 데이터소스 초기진입시와 모든 필터가 ALL이나 NONE(아무것도 선택이 안된상태)에서는 기존처럼
api/datasources?size=20&page=0&sort=createdTime%2Cdesc&projection=forListView
이 api를 호출하면 되나요?
@brandon-wonjune
@ufoscw 개발 도중에 죄송합니다만, 몇가지 기획 변경사항이 생겼습니다. 아래에 논의 과정과 결과 공유드리니 의견 부탁드립니다.
(1,2 번을 적용해 본 안입니다)

@AnnieHwang @deidera08 논의한 내용과 다른 부분이 없는지 확인 부탁드립니다.
@ufoscw 문의사항있습니다.
현재 more 필터에서 필터를 추가시켜서 api 조회를 하고있습니다.
more가 아닌 기존 default로 제공되는 criterion 필터들은 적용시 정상적으로 조회가 되지만,
새로 추가한 필터를 적용하여 데이터소스 목록 조회시 에러가 발생합니다.
아래는 조회 예시입니다.
DATASOURCE_TYPE
// api
api/datasources/filter?projection=forListView&page=0&size=20
// params
{dataSourceType: ["MASTER", "JOIN", "VOLATILITY"]}
// error
app.metatron.discovery.common.exception.UnknownServerException
at app.metatron.discovery.common.exception.GlobalExceptionHandler.handleAll(GlobalExceptionHandler.java:149)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:384)
at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:59)
at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:136)
at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:76)
at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1222)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1034)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:984)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:110)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at app.metatron.discovery.common.web.CommonLocalVariableFilter.doFilter(CommonLocalVariableFilter.java:58)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at app.metatron.discovery.common.web.LogbackMdcFilter.doFilter(LogbackMdcFilter.java:59)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter.doFilter(OAuth2AuthenticationProcessingFilter.java:176)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:347)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:263)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:167)
at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:80)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
at app.metatron.discovery.domain.datasource.DataSourceController.filterDataSources(DataSourceController.java:891)
at app.metatron.discovery.domain.datasource.DataSourceController$$FastClassBySpringCGLIB$$8acf3b5d.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:669)
at app.metatron.discovery.domain.datasource.DataSourceController$$EnhancerBySpringCGLIB$$5ecdbee0.filterDataSources(<generated>)
at sun.reflect.GeneratedMethodAccessor403.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
... 88 more
나머지 추가 criterion 타입 (connectionType, sourceType) 도 위와 같은 에러가 발생합니다.
@brandon-wonjune API 오류 수정되었습니다.
@ufoscw 네 정상적으로 more내 모든 criterion 필터에 대해 조회가 되는것을 확인했습니다.
그런데 테스트 도중에 발견한 에러인데요.
datasource를 제거하면 에러가 발생하는데 다른화면 갔다오면은 삭제가 된 상태로 표시됩니다.
// api
(DELETE) api/datasources/{sorceId}
// error
app.metatron.discovery.common.exception.UnknownServerException
at app.metatron.discovery.common.exception.RestExceptionHandler.handleMiscFailures(RestExceptionHandler.java:95)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:384)
at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:59)
at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:136)
at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:76)
at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1222)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1034)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:984)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doDelete(FrameworkServlet.java:894)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:667)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:110)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at app.metatron.discovery.common.web.CommonLocalVariableFilter.doFilter(CommonLocalVariableFilter.java:58)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at app.metatron.discovery.common.web.LogbackMdcFilter.doFilter(LogbackMdcFilter.java:59)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter.doFilter(OAuth2AuthenticationProcessingFilter.java:176)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)
2018-11-27 09:49:08.773 at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
ERROR at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:347)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:263)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
[127.0.0.1-admin] [http-nio-8180-exec-2] a.m.d.c.exception.RestExceptionHandler at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
: at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:167)
[API:/api/datasources/550a8af3-01b8-4355-985b-2258b900c1c3] GB0001 null: NullPointerException: , {}
at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:80)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
at app.metatron.discovery.domain.datasource.DataSourceEventHandler.handleDataSourceAfterDelete(DataSourceEventHandler.java:414)
at app.metatron.discovery.domain.datasource.DataSourceEventHandler$$FastClassBySpringCGLIB$$d36826d1.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:669)
at app.metatron.discovery.domain.datasource.DataSourceEventHandler$$EnhancerBySpringCGLIB$$be27bb68.handleDataSourceAfterDelete(<generated>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:216)
at org.springframework.data.rest.core.event.AnnotatedEventHandlerInvoker.onApplicationEvent(AnnotatedEventHandlerInvoker.java:98)
at org.springframework.data.rest.core.event.AnnotatedEventHandlerInvoker.onApplicationEvent(AnnotatedEventHandlerInvoker.java:59)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:393)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:347)
at org.springframework.data.rest.webmvc.RepositoryEntityController.deleteItemResource(RepositoryEntityController.java:440)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
... 88 more
@minjung-cho
그리고 중복건에 대해서는
사용자는 Me 외에는 중복되는 사용자가 없습니다.
그룹명이 중복될수 있는데 카테고리의 의미가 있으니 중복되어도 상관 없지 않을까요?
@ufoscw @AnnieHwang 님과 논의하신것 같아서 1,2 번은 결론만 남기겠습니다.

@ufoscw
데이터소스 쪽 완료했는데요 커넥션 api도 같은 스펙으로 전달이 되나요?
@brandon-wonjune
네 스펙은 동일하며 api 주소만 바뀝니다.
@brandon-wonjune @AnnieHwang @minjung-cho
FilterLists-181129.xlsx

커넥션 필터 항목입니다.
(Security 항목은 문구가 길어서 줄였습니다.)
@brandon-wonjune

검색 조건 추가된게 있으니 다국어도 추가부탁드려요.
msg.storage.ui.criterion.open-data : Open Data
msg.storage.ui.criterion.modified-time : Modified Time
More를 통해 추가한 조건은 다시 삭제가 되어야 하는데 기획서 확인바랍니다.
@brandon-wonjune @deidera08
날짜 검색시 오늘, 최근 7일은 기획서에 current time으로 되어 있네요.
명시적으로 날짜를 표시하지 않고 "현재 시간"으로 표기하는게 공통 정책인가요?
@ufoscw @AnnieHwang @minjung-cho
아닙니다. 위에 해석하신 바가 맞습니다.
현재의 시간을 표기해 달라는 의미였습니다.
@ufoscw
@ufoscw @brandon-wonjune @AnnieHwang @minjung-cho
위의 날짜 표현에 내용을 보완합니다.
날짜를 Today 선택시 상단 필터값에 오늘 날짜를 표기합니다.
예) Created time: 2018-11-29 hh:mm
날짜를 Last 7days 선택시 상단 필터값에 7일전 날짜~오늘 날짜를 표기합니다.
예) Created time: 2018-11-23 00:00 ~ 2018-11-29 hh:mm
날짜를 Between 선택시 상단 필터값에 지정한 날짜를 표기합니다.
날짜를 지정하는것이 필수는 아니므로 미지정시 Past time ~ Current time으로 표기합니다.
(from, to 두 값 모두 지정을 하지 않았을 경우 사실상 All과 같음)
예) Created time: 2018-11-23 00:00 ~ 2018-11-29 hh:mm
예) Created time: Past time ~ 2018-11-29 hh:mm
예) Created time: 2018-11-23 00:00 ~ Current time
예) Created time: Past time ~ Current time
더불어 사용자가 그 외 필터를 추가시 Check box에 check시 필터가 추가되며 uncheck시 추가한 필터가 삭제되고 있습니다.
이 부분이 직관적이지 않은 것 같아 기획서대로 필터항목에 마우스오버시 삭제버튼을 노출시키는 방향으로 수정하려합니다.
디자인 요청하도록 하겠습니다.
@brandon-wonjune
DataConnection List Filter를 위한 API가 추가되었습니다.
Request/Response 스펙은 DataSource List Filter와 동일합니다.
(GET) /api/connections/criteria
(GET) /api/connections/criteria/{criterionKey}
(POST) /api/connections/filter
@ufoscw
(POST) /api/connections/filter
에대해 문의 드립니다.
기존에 생성한 사람을 표시할때 createdBy안에 fullName으로 표시해주고 있었는데요
앞으로는 fullName없이 createdBy가 생성한 사람이 되는건가요?
@brandon-wonjune
기존에 사용하던 projection을 사용하면 기존과 동일하게 데이터가 내려오지 않나요?
?projection=list
@ufoscw
답변감사합니다.
데이터소스 projection = forListView
데이터커넥션 projection = list가 맞죠?
이렇게 하면 정상적으로 내려옵니다.
데이터 커넥션에서 새로 추가된 msg.storage.ui.criterion.auth-type, msg.storage.ui.criterion.implementor 메시지 번들 추가하였습니다. 더 추가되는 메세지는 없는건가요?
remove 아이콘 추가하였습니다.

@AnnieHwang @deidera08 @ufoscw
검색의 항목을 누르면 바로 검색이 되어야 할것 같은데요. 꼭 "검색" 버튼을 눌러서 해야하는 이유가 있나요?
생성한 시간 부분 관련 내용 확인 부탁드립니다.

@ufoscw 고객 요건중, 미리 preset 으로 지정한 필터만 보게 하는 요건이 있는데요. 이것도 적용 되었나요?
@brandon-wonjune
@AnnieHwang @minjung-cho
수정하였습니다



@brandon-wonjune
화면 진입시 최초 검색 조건을 셋팅하는 요건에 대한 개발이 누락된것 같습니다.
최초 기본 검색 조건을 알려주는 API를 추가할 예정입니다.
추가되면 알려드릴게요.
@brandon-wonjune
기존 API의 response에 기본 필터 목록이 추가되면서 response 구조가 변경되었습니다.
(GET) /api/datasources/criteria
(GET) /api/connections/criteria
*AS-IS
{
[
"Criteria",
"Criteria",
"Criteria"....
]
}
*TO-BE
{
"criteria" : [
"Criteria",
"Criteria",
"Criteria",
....
]
}
{
"criteria" : [
"Criteria",
"Criteria",
"Criteria",
....
],
"defaultFilters" : [
"Filter",
"Filter",
....
]
}
실제 Response 샘플입니다.
(GET) /api/datasources/criteria
{
"criteria": [
{
"criterionKey": "STATUS",
"criterionType": "CHECKBOX",
"criterionName": "msg.storage.ui.criterion.status"
},
{
"criterionKey": "PUBLISH",
"criterionType": "CHECKBOX",
"criterionName": "msg.storage.ui.criterion.publish",
"searchable": true
},
{
"criterionKey": "CREATOR",
"criterionType": "CHECKBOX",
"criterionName": "msg.storage.ui.criterion.creator",
"searchable": true
},
{
"criterionKey": "CREATED_TIME",
"criterionType": "RANGE_DATETIME",
"criterionName": "msg.storage.ui.criterion.created-time",
"filters": [
{
"criterionKey": "CREATED_TIME",
"filterKey": "createdTimeFrom",
"filterSubKey": "createdTimeTo",
"filterName": "msg.storage.ui.criterion.created-time",
"filterValue": "",
"filterSubValue": ""
}
]
},
{
"criterionKey": "MORE",
"criterionType": "CHECKBOX",
"criterionName": "msg.storage.ui.criterion.more",
"subCriteria": [
{
"criterionKey": "MODIFIED_TIME",
"criterionType": "RANGE_DATETIME",
"criterionName": "msg.storage.ui.criterion.modified-time"
},
{
"criterionKey": "CONNECTION_TYPE",
"criterionType": "CHECKBOX",
"criterionName": "msg.storage.ui.criterion.connection-type"
},
{
"criterionKey": "DATASOURCE_TYPE",
"criterionType": "CHECKBOX",
"criterionName": "msg.storage.ui.criterion.ds-type"
},
{
"criterionKey": "SOURCE_TYPE",
"criterionType": "CHECKBOX",
"criterionName": "msg.storage.ui.criterion.source-type"
}
]
}
],
"defaultFilters": [
{
"criterionKey": "CREATOR",
"filterKey": "createdBy",
"filterName": "Administrator (me)",
"filterValue": "admin"
},
{
"criterionKey": "PUBLISH",
"filterKey": "published",
"filterName": "msg.storage.ui.criterion.open-data",
"filterValue": "true"
}
]
}
(GET) /api/connections/criteria
{
"criteria": [
{
"criterionKey": "PUBLISH",
"criterionType": "CHECKBOX",
"criterionName": "msg.storage.ui.criterion.publish",
"searchable": true
},
{
"criterionKey": "CREATOR",
"criterionType": "CHECKBOX",
"criterionName": "msg.storage.ui.criterion.creator",
"searchable": true
},
{
"criterionKey": "IMPLEMENTOR",
"criterionType": "CHECKBOX",
"criterionName": "msg.storage.ui.criterion.implementor"
},
{
"criterionKey": "AUTH_TYPE",
"criterionType": "CHECKBOX",
"criterionName": "msg.storage.ui.criterion.auth-type"
},
{
"criterionKey": "CREATED_TIME",
"criterionType": "RANGE_DATETIME",
"criterionName": "msg.storage.ui.criterion.created-time",
"filters": [
{
"criterionKey": "CREATED_TIME",
"filterKey": "createdTimeFrom",
"filterSubKey": "createdTimeTo",
"filterName": "msg.storage.ui.criterion.created-time",
"filterValue": "",
"filterSubValue": ""
}
]
},
{
"criterionKey": "MORE",
"criterionType": "CHECKBOX",
"criterionName": "msg.storage.ui.criterion.more",
"subCriteria": [
{
"criterionKey": "MODIFIED_TIME",
"criterionType": "RANGE_DATETIME",
"criterionName": "msg.storage.ui.criterion.modified-time"
}
]
}
],
"defaultFilter": []
}
@ufoscw
혹시 일부 값(PUBLISH, STATUS)이 기존에 오던 filterName과 filterValue가 다른 값으로 대체되었나요?
@brandon-wonjune
아니요..
어떤 부분이 바뀌었나요?
@ufoscw
기존에는 조회시 subCriteria가 없는 api에 대해 아래와 같이 전달되고있었습니다.

그래서 ui에서 표시는 filterName으로, 실제 검색시 요청하는 파라메터에는 filterValue로 전달하였습니다.
그런데 업데이트후 아래쪽같이 내려오는데, 아래에 맞춰서 변경을 해야되나요?

@brandon-wonjune
아니요. 기존 스펙은 로직 수정하실 필요없습니다.
오류는 수정할게요.
@brandon-wonjune
수정되었습니다.
@ufoscw 감사합니다
나머지 값은 잘옵니다.
그런데 아래 api에서 아래와 같은 에러가 발생합니다.
// api
api/connections/criteria/CREATOR
// error
app.metatron.discovery.common.exception.UnknownServerException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
at app.metatron.discovery.common.exception.GlobalExceptionHandler.handleAll(GlobalExceptionHandler.java:149)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:380)
at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:59)
at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:136)
at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:76)
at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1222)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1034)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:984)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:110)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at app.metatron.discovery.common.web.CommonLocalVariableFilter.doFilter(CommonLocalVariableFilter.java:58)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at app.metatron.discovery.common.web.LogbackMdcFilter.doFilter(LogbackMdcFilter.java:59)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter.doFilter(OAuth2AuthenticationProcessingFilter.java:176)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:347)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:263)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:167)
at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:80)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:261)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:244)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:503)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:209)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:57)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
at com.sun.proxy.$Proxy208.findByUsernames(Unknown Source)
at app.metatron.discovery.domain.datasource.connection.DataConnectionFilterService.getListCriterionByKey(DataConnectionFilterService.java:150)
at app.metatron.discovery.domain.datasource.connection.DataConnectionController.getCriterionDetail(DataConnectionController.java:722)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
... 88 more
Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:79)
at org.hibernate.loader.Loader.getResultSet(Loader.java:2117)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1900)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1876)
at org.hibernate.loader.Loader.doQuery(Loader.java:919)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336)
at org.hibernate.loader.Loader.doList(Loader.java:2617)
at org.hibernate.loader.Loader.doList(Loader.java:2600)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2429)
at org.hibernate.loader.Loader.list(Loader.java:2424)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:501)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1326)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:87)
at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:606)
at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:483)
at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:123)
at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:87)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:116)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:106)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:499)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:477)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:56)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
... 110 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
at com.mysql.jdbc.Util.getInstance(Util.java:387)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:941)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3870)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3806)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2470)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2617)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2550)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1962)
at sun.reflect.GeneratedMethodAccessor149.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:114)
at com.sun.proxy.$Proxy290.executeQuery(Unknown Source)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70)
... 140 more
@brandon-wonjune
아래 API도 동일하게 에러나나요?
/api/datasources/criteria/CREATOR
@ufoscw 아닙니다.
위 api는 정상적으로 조회가 됩니다.
@brandon-wonjune
음..네. 일단 저는 에러가 안나네요.
에러 나는 부분은 무시하고 작업 진행해주세요.
TestBed 올라간 뒤 다시 확인해볼게요.
@ufoscw
죄송합니다 TestBed에서는 잘나오네요.
새로 내려오는 defaultFilter는 초기화면 진입시에만 필터에 적용하면 되는 값 인가요?
만약 그렇다면, MORE와 CREATED_TIME도 체크되는 경우가 있나요?
@brandon-wonjune
네 최초 화면 진입시 검색조건으로 사용되면 됩니다.
created time은 포함하는게 좋아보입니만 more는 현재 상태에서는 고려 안하셔도 될것 같습니다.
@ufoscw
네. 그러면 CREATED_TIME의 경우는 어떤 형태로 오는지 sample을 받을수 있을까요?
현재는 UI에서 강제로 ALL과 TODAY, LAST7DAYS라고 정의를 해서 사용하고 있는데요,
특히 BETWEEN의 경우 from과 to의 선택한 DATE value가 어떤 형태로 전달될 수 있나요?
@brandon-wonjune
CreatedTime은 좀더 고려할게 많아 보이네요.
이번 이슈에는 제외하고 추후 고도화하면서 보강하시죠..
@ufoscw 네 알겠습니다.
PR오픈하겠습니다.
@brandon-wonjune
More를 통해 추가한 검색조건이 삭제되어도 파라미터에 포함되어 있습니다.
검색조건 삭제시 파라미터에서 제거해주세요.
@brandon-wonjune
아래 API 호출시 FilterName이 목록의 Data와 동일한 코드로 전달될 예정입니다.
목록과 동일하게 메시지 처리해주시면 됩니다.
(GET) /datasources/criteria/{criterionKey}
STATUS : [ENABLED, PREPARING, FAILED, BAD, DISABLED]
DATASOURCE_TYPE : [MASTER, JOIN, VOLATILITY]
SOURCE_TYPE : [FILE, HDFS, HIVE, JDBC, REALTIME, IMPORT, SNAPSHOT, NONE]
CONNECTION_TYPE : [ENGINE, LINK]
@ufoscw
filterName이 msg.형태로 내려온다는건가요?
그러면 메시지 처리를 그에 해당하게 변경하면 되나요?
@brandon-wonjune
아니요.
msg 메시지가 아니라 위에 적힌 코드로 내려갑니다.
현재 그리드에서 해당 코드를 변환하는 로직이 있으니 그걸 그대로 사용하면 될것 같습니다.
Most helpful comment
@brandon-wonjune
3-1. 선택값이 있을때는 타이틀 레이블이 보이면 안됩니다. 디자인 가이드 다시 확인 부탁드립니다.
3-2. 데이터 피커를 우측으로 뜨도록 이동 부탁드립니다.
3-3. 문구는 아래와 같이 변경 부탁드립니다.
(영) Last 7 dys
(한) 지난 7일
(영) Between
(한) 기간 @AnnieHwang 어떠신가요 ^^;