반응형
menuCd |
highMenuCd |
menuNm |
orderNo |
|
1001 |
0 |
고객 |
1 | |
1002 |
1001 |
고객리스트 |
2 | |
1003 | 1002 | 대기리스트 | 3 | |
1004 | 0 | 게시판 | 4 | |
1005 | 1004 | 자유게시판 | 5 | |
1006 | 1004 | 유머게시판 | 6 |
위와 같은 형식의 데이터를 DB에서 뽑아 냈을때 오른쪽과 같이 화면에 표현하고 싶었다.
우선 Tree는 jQuery기반의 드래그앤랍이 기능이 되는 "jquery.dynatree.js" 를 선택했다.
이제 위 2차원 배열형태의 데이터를 dynatree가 요구하는 데이터형태로 변환을 해야 한다.
요구하는 데이터형태는 트리형식으로 아래와 같은 스타일로 만들어주면 된다.
[
{"isFolder":"true","title":"고객","children":[
{"isFolder":"true","title":"고객리스트" }
...
]
....
]
위와 같은 형태로 만들려고 삽질 좀 하다가 javascript 기반으로 잘 만들어져있는 소스를 구글링을통해 발견하여 그것을 java기반으로 수정 하였습니다.
(http://programmingsummaries.tistory.com/250)
package
com.ezwel.welfare.core.util;
import
java.util.ArrayList;
import
java.util.Collections;
import
java.util.Comparator;
import
java.util.HashMap;
import
java.util.Iterator;
import
java.util.List;
import
java.util.Map;
import
org.apache.commons.beanutils.BeanUtils;
import
org.apache.commons.logging.Log;
import
org.apache.commons.logging.LogFactory;
/**
* JSON관련 가공에 필요한 함수들
* @auther ddakker 2013. 12. 12.
*/
public
class
JsonUtil {
private
static
final
Log log = LogFactory.getLog(JsonUtil.
class
);
/**
* 2차원 배열의 부모/자식 관계의 데이터를 트리형식으로 재나열 한다.
* @param list 2차원 배열
* @param rootId 최상위 id
* @param idKey 유니크한 키(id가 될 필드명)
* @param pIdKey 부모키(pId가 될 필드명)
* @param titleKey 메뉴명이 표시될 필드명
* @return
* @auther ddakker 2013. 12. 12.
*/
public
static
List<Map<String, Object>> convertorTreeMap(
final
List<Map<String, Object>> list, String rootId,
final
String idKey,
final
String pIdKey,
final
String titleKey){
return
convertorTreeMap(list, rootId, idKey, pIdKey, titleKey,
null
);
}
/**
* 2차원 배열의 부모/자식 관계의 데이터를 트리형식으로 재나열 한다.
* @param list 2차원 배열
* @param rootId 최상위 id
* @param idKey 유니크한 키(id가 될 필드명)
* @param pIdKey 부모키(pId가 될 필드명)
* @param titleKey 메뉴명이 표시될 필드명
* @param orderKey 정렬이 필요한경우 정령 필드명
* @return
* @auther ddakker 2013. 12. 12.
*/
public
static
List<Map<String, Object>> convertorTreeMap(List inList, String rootId,
final
String idKey,
final
String pIdKey,
final
String titleKey,
final
String orderKey){
List<Map<String, Object>> treeList =
new
ArrayList<Map<String,Object>>();
// 최종 트리
if
( inList ==
null
|| inList.size() ==
0
)
throw
new
RuntimeException(
"List<Map> 데이터가 없습니다."
);
if
( inList.get(
0
) ==
null
)
throw
new
RuntimeException(
"Map 데이터가 없습니다."
);
final
List<Map<String, Object>> list =
new
ArrayList<Map<String,Object>>();
// 원본데이터(Bean일경우 Map으로 변환)
Iterator iter;
for
( iter=inList.iterator(); iter.hasNext(); ) {
try
{
Object obj = iter.next();
if
( obj
instanceof
Map ) {
list.add((Map<String, Object>) obj);
}
else
{
list.add((Map<String, Object>) BeanUtils.describe(obj));
}
}
catch
(Exception e) {
throw
new
RuntimeException(
"Collection -> List<Map> 으로 변환 중 실패: "
+ e);
}
}
int
listLength = list.size();
int
loopLength =
0
;
final
int
[] treeLength =
new
int
[] {
0
};
while
( treeLength[
0
] != listLength && listLength != loopLength++ ) {
for
(
int
i=
0
; i<list.size(); i++ ) {
Map<String, Object> item = list.get(i);
if
( rootId.equals((String)item.get(pIdKey)) ) {
Map<String, Object> view =
new
HashMap<String, Object>(item);
view.put(
"title"
, item.get(titleKey));
view.put(
"children"
,
new
ArrayList<Map<String,Object>>());
treeList.add(view);
list.remove(i);
treeLength[
0
]++;
if
( orderKey !=
null
){
Collections.sort(treeList,
new
Comparator<Map<String, Object>>(){
public
int
compare(Map<String, Object> arg0, Map<String, Object> arg1) {
// TODO Auto-generated method stub
return
((String)arg0.get(orderKey)).compareTo((String)arg1.get(orderKey));
}
});
}
view.put(
"isFolder"
,
"true"
);
break
;
}
else
{
new
InnerClass(){
public
void
getParentNode(List<Map<String, Object>> children, Map<String, Object> item ) {
for
(
int
i=
0
; i<children.size(); i++ ) {
Map<String, Object> child = children.get(i);
if
( child.get(idKey).equals(item.get(pIdKey)) ) {
Map<String, Object> view =
new
HashMap<String, Object>(item);
view.put(
"title"
, item.get(titleKey));
view.put(
"children"
,
new
ArrayList<Map<String,Object>>());
((List<Map<String,Object>>) child.get(
"children"
)).add(view);
treeLength[
0
]++;
list.remove(list.indexOf(item));
view.put(
"isFolder"
,
"true"
);
if
( orderKey !=
null
){
Collections.sort(((List<Map<String,Object>>) child.get(
"children"
)),
new
Comparator<Map<String, Object>>(){
public
int
compare(Map<String, Object> arg0, Map<String, Object> arg1) {
// TODO Auto-generated method stub
return
((String)arg0.get(orderKey)).compareTo((String)arg1.get(orderKey));
}
});
}
break
;
}
else
{
if
( ((List<Map<String,Object>>) child.get(
"children"
)).size() >
0
){
getParentNode((List<Map<String,Object>>) child.get(
"children"
), item);
}
}
}
}
}.getParentNode(treeList, item);
}
}
}
return
treeList;
}
public
interface
InnerClass {
public
void
getParentNode(List<Map<String, Object>> list, Map<String, Object> item );
}
}