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.
package com.viaoa.json.jackson;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.viaoa.datasource.OADataSource;
import com.viaoa.datasource.OADataSourceIterator;
import com.viaoa.datasource.OASelect;
import com.viaoa.datasource.objectcache.OADataSourceObjectCache;
import com.viaoa.filter.OAQueryFilter;
import com.viaoa.hub.Hub;
import com.viaoa.json.OAJson;
import com.viaoa.json.OAJson.StackItem;
import com.viaoa.object.OAFinder;
import com.viaoa.object.OAFkeyInfo;
import com.viaoa.object.OALinkInfo;
import com.viaoa.object.OAObject;
import com.viaoa.object.OAObjectCacheDelegate;
import com.viaoa.object.OAObjectDelegate;
import com.viaoa.object.OAObjectInfoDelegate;
import com.viaoa.object.OAObjectKey;
import com.viaoa.object.OAObjectPropertyDelegate;
import com.viaoa.object.OAObjectReflectDelegate;
import com.viaoa.object.OAPropertyInfo;
import com.viaoa.object.OAThreadLocalDelegate;
import com.viaoa.pojo.PojoDelegate;
import com.viaoa.pojo.PojoLink;
import com.viaoa.pojo.PojoLinkOne;
import com.viaoa.pojo.PojoLinkOneDelegate;
import com.viaoa.pojo.PojoLinkUnique;
import com.viaoa.pojo.PojoProperty;
import com.viaoa.util.OAArray;
import com.viaoa.util.OAConv;
import com.viaoa.util.OADate;
import com.viaoa.util.OADateTime;
import com.viaoa.util.OAFilter;
import com.viaoa.util.OAPropertyPath;
import com.viaoa.util.OAString;
import com.viaoa.util.OATime;
// todo: unit test with CorpToStore model ... to check multipart keys/**
* Used by OAJson to convert JSON to OAObject(s).
* This will find the existing OAObjects and Hubs and add/update/delete.
*
* This supports object graphs, json from POJOs that might not have matching pkey properties.
* For POJOs without direct pkey & fkey properties, it uses the following to find and update matching OAObjects
*
*
Match using unique pkey property(s)
*
Guid match
*
ImportMatch properties
*
Links that have a unique property match.
*
Links that have an equals property path with a unique property match.
*
*/publicclassOAJacksonDeserializerLoader {privatefinal OAJson oajson;
privatefinalboolean bUsesPojo;
privateboolean debug = false;
privateint cntLoadCalled;
// list of references that were not found, that will be retried once at the end of load.privatefinal List alRetryPojoReference = new ArrayList();
public OAJacksonDeserializerLoader(OAJson oaj) {
this.oajson = oaj;
this.bUsesPojo = oaj.getReadingPojo();
}
public T load(final JsonNode node, final T root) {
T t = load(node, root, null);
return t;
}
/**
* Main method called by OAJacksonModule to load an OAObject and any references from json tree.
*/public T load(final JsonNode node, final T root, Class clazz) {
if (node == null) {
return root;
}
if (clazz == null) {
if (root == null) {
returnnull;
}
clazz = (Class) root.getClass();
}
OAJson.StackItem stackItem = new OAJson.StackItem();
stackItem.oi = OAObjectInfoDelegate.getOAObjectInfo(clazz);
stackItem.obj = root;
stackItem.node = node;
final StackItem siHold = oajson.getStackItem();
oajson.setStackItem(stackItem);
try {
load(stackItem);
retryPojoReferences();
} finally {
oajson.setStackItem(siHold);
}
return (T) stackItem.obj;
}
/**
* Main method for loading JsonObject into a (new or existing) OAObject.
* Recursively will load all link objects.
*
* find or create a matching OAObject from an JsonObject.
* This will first use the stack, then guid, pkeys, importMatches, linkWithUnique, linkWithEqualAndUnique.
*/protectedboolean load(final StackItem stackItem) {
if (stackItem == null) {
returnfalse;
}
String debug = ++cntLoadCalled + ")";
debug(stackItem, "BEG " + debug);
if (stackItem.node == null) {
returnfalse;
}
// 1:
findExistingObject(stackItem);
if (stackItem.node.isObject()) {
if (stackItem.obj == null) {
// 2a:
createObject(stackItem);
} else {
if (stackItem.li != null && stackItem.li.getAutoCreateNew()) {
OAObjectKey ok = stackItem.obj.getObjectKey();
if (ok.isNew()) {
// 2b:
loadObjectIdProperties(stackItem);
}
}
}
// 3:
loadObject(stackItem);
}
debug(stackItem, "END " + debug);
returntrue;
}
protectedvoid createObject(final StackItem stackItem) {
final Class clazz = stackItem.oi.getForClass();
debug2(stackItem, "createObject");
oajson.beforeReadCallback(stackItem.node);
stackItem.obj = (OAObject) OAObjectReflectDelegate.createNewObject(clazz);
boolean bNeedsAssignedId = loadObjectIdProperties(stackItem);
if (OAThreadLocalDelegate.isLoading()) {
OAThreadLocalDelegate.setLoading(false);
try {
OAObjectDelegate.initializeAfterLoading((OAObject) stackItem.obj, bNeedsAssignedId, false, false);
} finally {
OAThreadLocalDelegate.setLoading(true);
}
}
}
protectedboolean loadObjectIdProperties(final StackItem stackItem) {
boolean bNeedsAssignedId = false;
if (bUsesPojo) {
for (OAPropertyInfo pi : stackItem.oi.getPropertyInfos()) {
if (pi.getId() && pi.getAutoAssign()) {
bNeedsAssignedId = true;
break;
}
}
for (PojoProperty pp : PojoDelegate.getPojoPropertyKeys(stackItem.oi.getPojo())) {
String propertyName = pp.getName();
if (!oajson.getUsePropertyCallback(null, propertyName)) {
continue;
}
propertyName = oajson.getPropertyNameCallback(null, propertyName);
JsonNode jn = stackItem.node.get(propertyName);
OAPropertyInfo pi = OAObjectInfoDelegate.getPropertyInfo(stackItem.oi, propertyName);
if (pi == null) {
continue;
}
if (pi.getAutoAssign()) {
bNeedsAssignedId = false;
}
Object objx = convert(jn, pi);
objx = oajson.getPropertyValueCallback(null, pi.getLowerName(), objx);
stackItem.obj.setProperty(pi.getLowerName(), objx);
}
} else {
for (OAPropertyInfo pi : stackItem.oi.getPropertyInfos()) {
if (!pi.getId()) {
continue;
}
String propertyName = pi.getLowerName();
if (!oajson.getUsePropertyCallback(null, propertyName)) {
continue;
}
propertyName = oajson.getPropertyNameCallback(null, stackItem.oi.getJsonUsesCapital() ? pi.getName() : propertyName);
JsonNode jn = stackItem.node.get(propertyName);
if (jn == null) {
bNeedsAssignedId |= pi.getAutoAssign();
continue;
}
Object objx = convert(jn, pi);
objx = oajson.getPropertyValueCallback(null, pi.getLowerName(), objx);
stackItem.obj.setProperty(pi.getLowerName(), objx);
}
}
return bNeedsAssignedId;
}
protectedvoid loadObject(final StackItem stackItem) {
if (stackItem.node == null || !stackItem.node.isObject()) {
thrownew RuntimeException("loadObject does not have a node.isObject=true");
}
debug2(stackItem, "loadObject " + stackItem.oi.getName());
loadObjectProperties(stackItem);
final Set hsLinkInfoOneLoaded = new HashSet();
if (stackItem.li != null && stackItem.li.isMany2One()) {
hsLinkInfoOneLoaded.add(stackItem.li.getReverseLinkInfo());
}
Iterator itx = stackItem.node.fieldNames();
for (; itx.hasNext();) {
String name = itx.next();
OALinkInfo lix = stackItem.oi.getLinkInfo(name);
if (lix == null) {
continue;
}
if (lix.isOne()) {
if (!hsLinkInfoOneLoaded.contains(lix)) {
if (loadObjectOneLink(stackItem, lix)) {
hsLinkInfoOneLoaded.add(lix);
}
}
} else {
loadObjectManyLink(stackItem, lix);
}
}
loadObjectReferences(stackItem, hsLinkInfoOneLoaded);
}
protectedvoid loadObjectProperties(final StackItem stackItem) {
OAObjectKey objKey = stackItem.obj.getObjectKey();
// debug2(stackItem, "loadObjectProperties");if (!bUsesPojo) {
JsonNode jn = stackItem.node.get("guid");
if (jn != null) {
int guid = jn.asInt();
if (oajson != null) {
oajson.getGuidMap().put(guid, stackItem.obj);
}
}
}
// load propertiesfor (OAPropertyInfo pi : stackItem.oi.getPropertyInfos()) {
if (pi.getId()) {
continue;
}
if (!oajson.getUsePropertyCallback(stackItem.obj, pi.getLowerName())) {
continue;
}
String propertyName = stackItem.oi.getJsonUsesCapital() ? pi.getName() : pi.getLowerName();
propertyName = oajson.getPropertyNameCallback(stackItem.obj, propertyName);
JsonNode jn = stackItem.node.get(propertyName);
if (jn == null) {
continue;
}
Object objx = convert(jn, pi);
objx = oajson.getPropertyValueCallback(stackItem.obj, pi.getLowerName(), objx);
stackItem.obj.setProperty(pi.getLowerName(), objx);
}
}
protectedboolean loadObjectOneLink(final StackItem stackItem, final OALinkInfo li) {
if (li.getType() != li.TYPE_ONE) {
returnfalse;
}
if (li.getPrivateMethod()) {
returnfalse;
}
if (!oajson.getUsePropertyCallback(stackItem.obj, li.getLowerName())) {
returnfalse;
}
// debug2(stackItem, "loadObjectOneLink " + li.getName());
StackItem stackItemChild = new StackItem();
stackItemChild.parent = stackItem;
stackItemChild.oi = li.getToObjectInfo();
stackItemChild.li = li;
stackItemChild.node = stackItem.node.get(stackItem.oi.getJsonUsesCapital() ? li.getName() : li.getLowerName());
try {
oajson.setStackItem(stackItemChild);
boolean b = loadObjectOneLink(stackItem, stackItemChild);
return b;
} finally {
oajson.setStackItem(stackItem);
}
}
protectedboolean loadObjectOneLink(final StackItem stackItem, final StackItem stackItemChild) {
debug2(stackItem, "loadObjectOneLink " + stackItemChild.li.getName());
if (stackItem.node == null) {
returnfalse;
}
boolean b = load(stackItemChild);
if (b) {
stackItem.obj.setProperty(stackItemChild.li.getLowerName(), stackItemChild.obj);
}
return b;
}
protectedvoid loadObjectManyLink(final StackItem stackItem, final OALinkInfo li) {
// load links of type=many
debug2(stackItem, "loadObjectManyLink " + li.getName());
if (li.getType() != li.TYPE_MANY) {
return;
}
if (li.getPrivateMethod()) {
return;
}
if (!oajson.getUsePropertyCallback(stackItem.obj, li.getLowerName())) {
return;
}
String propertyName = oajson.getPropertyNameCallback(stackItem.obj, stackItem.oi.getJsonUsesCapital() ? li.getName() : li.getLowerName());
JsonNode nodex = stackItem.node.get(propertyName);
if (!(nodex instanceof ArrayNode)) {
return;
}
Hub hub = (Hub) li.getValue(stackItem.obj);
ArrayNode nodeArray = (ArrayNode) nodex;
List alAdded = new ArrayList();
int x = nodeArray.size();
for (int i = 0; i < x; i++) {
nodex = nodeArray.get(i);
StackItem stackItemChild = new StackItem();
stackItemChild.parent = stackItem;
stackItemChild.oi = li.getToObjectInfo();
stackItemChild.li = li;
stackItemChild.node = nodex;
try {
oajson.setStackItem(stackItemChild);
load(stackItemChild);
alAdded.add(stackItemChild.obj);
if (!hub.contains(stackItemChild.obj)) {
hub.add(stackItemChild.obj);
}
} finally {
oajson.setStackItem(stackItem);
}
}
List alRemove = new ArrayList();
for (OAObject objx : hub) {
if (!alAdded.contains(objx)) {
alRemove.add(objx);
}
}
for (OAObject objx : alRemove) {
hub.remove(objx);
}
// same orderint i = 0;
for (OAObject objx : alAdded) {
int pos = hub.getPos(objx);
if (pos != i) {
hub.move(pos, i);
}
i++;
}
oajson.afterReadCallback(stackItem.node, stackItem.obj);
}
protectedvoid loadObjectReferences(final StackItem stackItem, final Set hsLinkInfoOneLoaded) {
if (!bUsesPojo) {
loadObjectNonPojoReferences(stackItem, hsLinkInfoOneLoaded);
} else {
loadObjectPojoReferences(stackItem, hsLinkInfoOneLoaded);
}
}
protectedvoid loadObjectNonPojoReferences(final StackItem stackItem, final Set hsLinkInfoOneLoaded) {
// load linkOne using fkeys, if the linkOne node did not existfor (OALinkInfo li : stackItem.oi.getLinkInfos()) {
if (!li.isOne()) {
continue;
}
if (hsLinkInfoOneLoaded.contains(li)) {
continue;
}
boolean bHasNull = false;
ArrayList