/*******************************************************************************
* Copyright (c) 2013 hangum.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v2.1
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* Contributors:
* hangum - initial API and implementation
******************************************************************************/
package com.hangum.tadpole.mongodb.core.utils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import com.hangum.tadpole.engine.query.dao.mongodb.CollectionFieldDAO;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
/**
* mongodb의 collection(table)의 정보를 리턴합니다.
*
* @author hangum
*
*/
public class MongoDBTableColumn {
static Logger logger = Logger.getLogger(MongoDBTableColumn.class);
/**
* TableView에서 사용할 몽고디비 헤더를 정의한다.
*
* @param dbObject
* @param mapColumns
* @return
*/
public static Map<Integer, String> getTabelColumnView(DBObject dbObject, Map<Integer, String> mapColumns) {
if(dbObject == null) return mapColumns;
int i = mapColumns.size();
for (String name : dbObject.keySet()) {
if(!mapColumns.containsValue(name)) {
mapColumns.put(i, name);
i++;
}
}
return mapColumns;
}
/**
* TableViewer의 컬럼 정보를 보여주도록 합니다.
*
* @return
*/
public static Map<Integer, String> getTabelColumnView(DBObject dbObject) {
Map<Integer, String> map = new HashMap<Integer, String>();
if(dbObject == null) return map;
int i=0;
Set<String> names = dbObject.keySet();
for (String name : names) {
map.put(i, name);
i++;
}
return map;
}
/**
* mongodb table column 정보
*
* @param indexInfo
* @param dbObject
* @return
*/
public static List<CollectionFieldDAO> tableColumnInfo(List<DBObject> indexInfo, DBObject dbObject) {
Map<String, Boolean> mapIndex = new HashMap<String, Boolean>();
// key list parsing
for (DBObject indexObject : indexInfo) {
String realKey = StringUtils.substringBetween(indexObject.get("key").toString(), "\"", "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
mapIndex.put(realKey, true);
}
// column info
List<CollectionFieldDAO> retColumns = new ArrayList<CollectionFieldDAO>();
try {
// 컬럼이 하나도 없을 경우..
if(dbObject == null) return retColumns;
Set<String> names = dbObject.keySet();
for (String name : names) {
CollectionFieldDAO column = new CollectionFieldDAO(name,
dbObject.get(name) != null?dbObject.get(name).getClass().getSimpleName():"Unknow", //$NON-NLS-1$
mapIndex.get(name) != null?"YES":"NO"); //$NON-NLS-1$ //$NON-NLS-2$
// 자식들이 있는 케이스 이면
if( dbObject.get(name) instanceof BasicDBObject ) {
makeTableColumn(column, (BasicDBObject)dbObject.get(name));
}
retColumns.add(column);
}
} catch(Exception e) {
logger.error("get MongoDB table column info", e); //$NON-NLS-1$
}
return retColumns;
}
/**
* sub column 정보를 리턴합니다.
*
* @param column
* @param dbObject
*/
private static void makeTableColumn(CollectionFieldDAO column, BasicDBObject dbObject) {
Set<String> names = dbObject.keySet();
List<CollectionFieldDAO> listChildField = new ArrayList<CollectionFieldDAO>();
for (String name : names) {
CollectionFieldDAO columnSub = new CollectionFieldDAO(name, //$NON-NLS-1$
dbObject.get(name) != null ? dbObject.get(name).getClass().getSimpleName():"Unknow", //$NON-NLS-1$
"NO"); //$NON-NLS-1$
if( dbObject.get(name) instanceof BasicDBObject ) {
makeTableColumn(columnSub, (BasicDBObject)dbObject.get(name));
}
listChildField.add(columnSub);
}
column.setChildren(listChildField);
}
}