Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
org.tinygroup.mongodb.util.MapConvert Maven / Gradle / Ivy
/**
* Copyright (c) 1997-2013, tinygroup.org ([email protected] ).
*
* Licensed under the GPL, Version 3.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.gnu.org/licenses/gpl.html
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* --------------------------------------------------------------------------
* 版权 (c) 1997-2013, tinygroup.org ([email protected] ).
*
* 本开源软件遵循 GPL 3.0 协议;
* 如果您不遵循此协议,则不被允许使用此文件。
* 你可以从下面的地址获取完整的协议文本
*
* http://www.gnu.org/licenses/gpl.html
*/
package org.tinygroup.mongodb.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.tinygroup.commons.tools.CollectionUtil;
import org.tinygroup.context.Context;
import org.tinygroup.mongodb.common.Field;
import org.tinygroup.mongodb.common.ObjectField;
import org.tinygroup.mongodb.common.Operation;
import org.tinygroup.mongodb.common.OperationField;
import org.tinygroup.mongodb.common.OperationGroup;
import org.tinygroup.mongodb.engine.MongoField;
import org.tinygroup.mongodb.model.MongoDBModel;
import com.mongodb.BasicDBObject;
public class MapConvert {
private Context context;
private MongoDBModel model;
private Operation operation;
Map objectStatus=new HashMap();
public MapConvert(MongoDBModel model, Operation operation, Context context) {
this.context = context;
this.model = model;
this.operation = operation;
}
public Map deal(Context newContext) {
Map map = new HashMap();
initOperationObject(operation.getOperationGroup(), map);
return map;
}
public void insertOperationObject(OperationGroup operationGroup,
Map map) {
if (operationGroup != null) {
List operationFields = operationGroup.getFields();
for (OperationField operationField : operationFields) {
MongoField mongoField = model.getMongoField(operationField
.getFieldId());
ObjectField of = mongoField.getObjectField();
if (of == null) {
dealField(mongoField, map, "", operationField.isHidden());
} else {
if (of.isArray()) {
if (map.get(of.getName()) == null) {
map.put(of.getName(),
new ArrayList>());
objectStatus.put(of.getName(), true);
}
} else {
if (map.get(of.getName()) == null) {
map.put(of.getName(), new HashMap());
}
}
dealInsertObjectField(of, mongoField, map, "",
operationField.isHidden());
}
}
if (!CollectionUtil.isEmpty(operationGroup.getOperationGroups())) {
for (OperationGroup group : operationGroup.getOperationGroups()) {
initOperationObject(group, map);
}
}
}
}
public void addObjectArrayOperationObject(OperationGroup operationGroup,
Map addToSetMap,Map commonMap) {
if (operationGroup != null) {
List operationFields = operationGroup.getFields();
for (OperationField operationField : operationFields) {
MongoField mongoField = model.getMongoField(operationField
.getFieldId());
ObjectField of = mongoField.getObjectField();
if (of != null) {
if (of.isArray()) {
Map subMap=(Map) addToSetMap.get(of.getName());
if (subMap == null) {
subMap = new HashMap();
subMap.put("$each",
new ArrayList>());
addToSetMap.put(of.getName(), subMap);
objectStatus.put(of.getName(), true);
}
dealAddObjectModel(of, mongoField, addToSetMap, "",
operationField.isHidden());
}else{//不是数组格式
Map objectMap = (Map) commonMap.get(of
.getName());
if (objectMap == null) {
objectMap= new HashMap();
commonMap.put(of.getName(),objectMap);
}
String propertyName = mongoField.getFieldName();
Object value = context.get(propertyName);
if (value == null) {
if (operationField.isHidden()) {
value = mongoField.getFieldDefaultValue();
}
}
Field field = mongoField.getField();
objectMap.put(field.getName(), value);
}
}else{
dealField(mongoField, commonMap, "", operationField.isHidden());
}
}
// if (!CollectionUtil.isEmpty(operationGroup.getOperationGroups())) {
// for (OperationGroup group : operationGroup.getOperationGroups()) {
// initOperationObject(group, map);
// }
// }
}
}
public void removeObjectOperationObject(OperationGroup operationGroup,
Map map) {
if (operationGroup != null) {
List operationFields = operationGroup.getFields();
for (OperationField operationField : operationFields) {
MongoField mongoField = model.getMongoField(operationField
.getFieldId());
ObjectField of = mongoField.getObjectField();
if (of != null) {
if (of.isArray()) {
if (map.get("$pull") == null) {
Map removeMap=new HashMap();
map.put("$pull", removeMap);
Map subMap=new HashMap();
removeMap.put(of.getName(), subMap);
}//删除对象数组中元素
dealRemoveObjectModel(of, mongoField, map, "",
operationField.isHidden());
}else{
Map removeMap=new HashMap();
map.put("$unset", removeMap);
removeMap.put(of.getName(), 1);
break;//移除对象字段
}
}
}
if (!CollectionUtil.isEmpty(operationGroup.getOperationGroups())) {
for (OperationGroup group : operationGroup.getOperationGroups()) {
initOperationObject(group, map);
}
}
}
}
public void updateOperationObject(OperationGroup operationGroup,
Map map) {
if (operationGroup != null) {
List operationFields = operationGroup.getFields();
for (OperationField operationField : operationFields) {
MongoField mongoField = model.getMongoField(operationField
.getFieldId());
ObjectField of = mongoField.getObjectField();
if (of == null) {
dealField(mongoField, map, "", operationField.isHidden());
} else {
dealUpdateObjectField(of, mongoField, map, "",
operationField.isHidden());
}
}
if (!CollectionUtil.isEmpty(operationGroup.getOperationGroups())) {
for (OperationGroup group : operationGroup.getOperationGroups()) {
initOperationObject(group, map);
}
}
}
}
public void initOperationObject(OperationGroup operationGroup,
Map map) {
if (operationGroup != null) {
List operationFields = operationGroup.getFields();
for (OperationField operationField : operationFields) {
MongoField mongoField = model.getMongoField(operationField
.getFieldId());
ObjectField of = mongoField.getObjectField();
if (of == null) {
dealField(mongoField, map, "", operationField.isHidden());
} else {
dealObjectField(of, map, "", operationField.isHidden());
}
// } else {
// dealObjectField(of, map, "", operationField.isHidden());
// }
}
if (!CollectionUtil.isEmpty(operationGroup.getOperationGroups())) {
for (OperationGroup group : operationGroup.getOperationGroups()) {
initOperationObject(group, map);
}
}
}
}
private void dealAddObjectModel(ObjectField of, MongoField mongoField,
Map map, String parentName, boolean hidden) {
String propertyName = mongoField.getFieldName();
Map addMap=(Map) map.get(of.getName());
List> objectList = (List>) addMap.get("$each");
Object value = context.get(propertyName);
if (value!=null&&value.getClass().isArray()) {
Object[] values=(Object[])value;
if(objectStatus.get(of.getName())){
for (int i = 0; i < values.length; i++) {
Map subMap=new HashMap();
objectList.add(subMap);
}
objectStatus.put(of.getName(), false);
}
Field field = mongoField.getField();
for (int i = 0; i < values.length; i++) {
Map subMap = objectList.get(i);
if (values[i] == null) {
if (hidden) {
values[i] = mongoField.getFieldDefaultValue();
}
}
subMap.put(field.getName(), values[i]);
}
}else{
if(objectStatus.get(of.getName())){
Map subMap=new HashMap();
objectList.add(subMap);
objectStatus.put(of.getName(), false);
}
Field field = mongoField.getField();
Map subMap = objectList.get(0);
if (value == null) {
if (hidden) {
value = mongoField.getFieldDefaultValue();
}
}
subMap.put(field.getName(), value);
}
}
private void dealInsertObjectField(ObjectField of, MongoField mongoField,
Map map, String string, boolean hidden) {
String propertyName = mongoField.getFieldName();
if (of.isArray()) {// 暂时只支持两层嵌套
List> objectList = (List>) map
.get(of.getName());
Object value = context.get(propertyName);
if (value!=null) {
if(value.getClass().isArray()){
Object[] values=(Object[])value;
if(objectStatus.get(of.getName())){
for (int i = 0; i < values.length; i++) {
Map subMap=new HashMap();
objectList.add(subMap);
}
objectStatus.put(of.getName(), false);
}
Field field = mongoField.getField();
for (int i = 0; i < values.length; i++) {
Map subMap = objectList.get(i);
if (values[i] == null) {
if (hidden) {
values[i] = mongoField.getFieldDefaultValue();
}
}
subMap.put(field.getName(), values[i]);
}
}else{
if(objectStatus.get(of.getName())){
Map subMap=new HashMap();
objectList.add(subMap);
objectStatus.put(of.getName(), false);
}
Field field = mongoField.getField();
Map subMap = objectList.get(0);
if (value == null) {
if (hidden) {
value = mongoField.getFieldDefaultValue();
}
}
subMap.put(field.getName(), value);
}
}
} else {
Map objectMap = (Map) map.get(of
.getName());
Object value = context.get(propertyName);
if (value == null) {
if (hidden) {
value = mongoField.getFieldDefaultValue();
}
}
Field field = mongoField.getField();
objectMap.put(field.getName(), value);
}
}
private void dealRemoveObjectModel(ObjectField of, MongoField mongoField,
Map map, String string, boolean hidden) {
String propertyName = mongoField.getFieldName();
Map removeMap=(Map) map.get("$pull");
Map objectMap = (Map) removeMap.get(of
.getName());
Object value = context.get(propertyName);
if (value == null) {
if (hidden) {
value = mongoField.getFieldDefaultValue();
}
}
Field field = mongoField.getField();
if(value!=null){
objectMap.put(field.getName(), value);
}
}
private void dealUpdateObjectField(ObjectField of, MongoField mongoField,
Map map, String string, boolean hidden) {
String propertyName = mongoField.getFieldName();
Object value = context.get(propertyName);
if (value == null) {
if (hidden) {
value = mongoField.getFieldDefaultValue();
}
}
if (of.isArray()) {
Field field = mongoField.getField();
map.put(of.getName() + ".$." + field.getName(), value);
} else {
map.put(propertyName, value);
}
}
private void dealField(MongoField field, Map map,
String parentName, boolean isHidden) {
String propertyName = field.getFieldName();
Object value = context.get(propertyName);
if (value == null) {
if (isHidden) {
value = field.getFieldDefaultValue();
}
}
if(value!=null){
map.put(propertyName, value);
}
}
/*
*
*
* name:"lily" age:11 pic: [ { obj:[
* {name:"1",age:11,address:[{provice:[{name
* :p1},{name:p11}]},{provice:[{name:p111}]}]},
* {name:"2",age:12,address:[{provice
* :[{name:p2},{name:p21}]},{provice:[{name:p221}]}]},
* {name:"3",age:13,address
* :[{provice:[{name:p3},{name:p31}]},{provice:[{name:p331}]}]}] ,
* name:"aa1" },
*
* { obj:[
* {name:"4",age:14,address:[{provice:[{name:p4},{name:p41},{name:p441
* }]},{provice:[{name:p4441}]}]},
* {name:"5",age:15,address:[{provice:[{name:
* p5},{name:p51}]},{provice:[{name:p551}]}]},
* {name:"6",age:16,address:[{provice
* :[{name:p6}]},{provice:[{name:p661},{name:p6661},{name:p66661}]}]}] ,
* name:"aa2" } ],
*
* location:[
* {name:"l1",where:[{place:"p1",controy:{name:"c1"}},{place:"p12"
* ,controy:{name:"c2"}]} {name:"l2",where:[{place:"p2"}]} ]
*
* }
*/
/**
* 处理第一层的数据对象
*
* @param of
* @param map
* @param parentName
* @param isHidden
*/
private void dealObjectField(ObjectField of, Map map,
String parentName, boolean isHidden) {
// String fieldPathName = get(parentName, of.getName());
String fieldPathName = getName(of.getId());
String fieldName = of.getName();
if (of.isArray()) {
String arrayLength = get(fieldPathName, "TINY_LENGTH");
String lengthString = (String) context.get(arrayLength);
if (lengthString == null || "".equals(lengthString)) {
return;
}
int firstLength = Integer.parseInt(lengthString);// 2
int[] lengthArray = new int[] { firstLength };
List> mapList = new ArrayList>();
for (int i = 0; i < lengthArray[0]; i++) {// length = 2
mapList.add(new HashMap());
}
for (ObjectField child : of.getObjectFields()) {
dealObjectFieldArray(child, fieldPathName, isHidden,
lengthArray, mapList);
}
for (Field child : of.getFields()) {
dealFieldArray(child, fieldPathName, mapList);
}
map.put(fieldName, mapList);
} else {
for (ObjectField child : of.getObjectFields()) {
dealObjectField(child, map, fieldPathName, isHidden);
}
for (Field child : of.getFields()) {
// dealField(child, map, fieldPathName, isHidden);
}
}
}
private void dealFieldArray(Field field, String parentName,
List> mapList) {
String propertyName = get(parentName, field.getName());
Object[] value = context.get(propertyName);
for (int i = 0; i < mapList.size(); i++) {
mapList.get(i).put(field.getName(), value[i]);
}
}
@SuppressWarnings("unchecked")
private void dealObjectFieldArray(ObjectField of, String parentName,
boolean isHidden, int[] parentArray,// [2]
List> mapList) {
String fieldPathName = getName(of.getId());
String fieldName = of.getName();
// get(parentName, of.getName());// pic.obj
if (of.isArray()) {
String arrayLength = get(fieldPathName, "TINY_LENGTH");// pic.obj.tinylength
int[] lengthArray = context.get(arrayLength);// [3,3]
List> thisMapList = new ArrayList>();
for (int i = 0; i < mapList.size(); i++) {
List> subMapList = new ArrayList>();
for (int j = 0; j < lengthArray[i]; j++) {
Map map = new HashMap();
subMapList.add(map);
thisMapList.add(map);
}
// mapList.get(i).put(fieldPathName, subMapList);
mapList.get(i).put(fieldName, subMapList);
}
for (Field child : of.getFields()) {
String childName = child.getName();
String propertyName = get(fieldPathName, childName);
Object[] value = context.get(propertyName);
int length = 0;
for (int i = 0; i < mapList.size(); i++) {
int oldLength = length;
length = length + lengthArray[i];
for (int j = oldLength, m = 0; j < length; j++, m++) {
List> mapl = (List>) mapList
.get(i).get(fieldName);
mapl.get(m).put(childName, value[j]);
}
}
}
for (ObjectField child : of.getObjectFields()) {
dealObjectFieldArray(child, fieldPathName, isHidden,
lengthArray, thisMapList);
}
} else {
List> subMapList = new ArrayList>();
for (int i = 0; i < mapList.size(); i++) {
Map subMap = new HashMap();
mapList.get(i).put(of.getName(), subMap);
subMapList.add(subMap);
}
for (Field child : of.getFields()) {
String childName = child.getName();
String propertyName = get(fieldPathName, childName);
Object[] value = context.get(propertyName);
for (int i = 0; i < mapList.size(); i++) {
subMapList.get(i).put(childName, value[i]);
}
}
for (ObjectField child : of.getObjectFields()) {
String propertyName = get(fieldPathName, child.getName());
dealObjectFieldArray(child, propertyName, isHidden,
parentArray, subMapList);
}
}
}
private String get(String parentName, String name) {
if (parentName == null || "".equals(parentName))
return name;
return parentName + "." + name;
}
private String getName(String fieldId) {
return model.getMongoField(fieldId).getFieldName();
}
}