From: Nico K. <nkl...@us...> - 2007-12-22 17:55:12
|
Update of /cvsroot/mmapps/mmapps/remotepublishing/src/org/mmbase/remotepublishing In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv22094/remotepublishing/src/org/mmbase/remotepublishing Modified Files: PublishManager.java Log Message: Improved performance of synchronization of binary fields based on optional checksum field Index: PublishManager.java =================================================================== RCS file: /cvsroot/mmapps/mmapps/remotepublishing/src/org/mmbase/remotepublishing/PublishManager.java,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** PublishManager.java 20 Sep 2007 18:24:45 -0000 1.8 --- PublishManager.java 22 Dec 2007 17:55:00 -0000 1.9 *************** *** 262,267 **** else { if (sourceNode.getNodeManager().getField(fieldName).getState() != Field.STATE_SYSTEM) { ! destinationNode.setValueWithoutProcess(fieldName, ! sourceNode.getValueWithoutProcess(fieldName)); } } --- 262,267 ---- else { if (sourceNode.getNodeManager().getField(fieldName).getState() != Field.STATE_SYSTEM) { ! destinationNode.setValueWithoutProcess(fieldName, ! sourceNode.getValueWithoutProcess(fieldName)); } } *************** *** 528,532 **** * * @param localNode this localNode must come from local cloud. ! * @return */ public static boolean isImported(Node localNode) { --- 528,532 ---- * * @param localNode this localNode must come from local cloud. ! * @return is node imported */ public static boolean isImported(Node localNode) { *************** *** 1015,1055 **** } ! Map<Integer,Node> publishedNodesMap = getPublishedNodes(publishInfoNodes); ! Iterator<Integer> cloudNumberIterator = publishedNodesMap.keySet().iterator(); ! ! while(cloudNumberIterator.hasNext()) { ! int remoteCloudNumber = cloudNumberIterator.next(); ! CloudInfo remoteCloudInfo = CloudInfo.getCloudInfo(remoteCloudNumber); ! Node remoteNode = publishedNodesMap.get(remoteCloudNumber); ! ! if (updateNode && updatedAfterTimestamp.contains(localNode.getNumber())) { ! syncNode(localCloudInfo, localNode, remoteCloudInfo, remoteNode); ! } ! if (updateRelations) { ! if (relatedNodes != null && relatedNodes.size() > 0) { ! syncRelations(localCloudInfo, localNode, remoteCloudInfo, remoteNode, relatedNodes); } ! else { ! syncRelations(localCloudInfo, localNode, remoteCloudInfo, remoteNode); } } ! } } } private static Date getLastModifiedDate(Node localNode) { for (Iterator<Field> iterator = localNode.getNodeManager().getFields().iterator(); iterator.hasNext();) { Field field = iterator.next(); ! if (field.getType() == Field.TYPE_DATETIME) { DataType dtype = field.getDataType(); ! while (dtype != null && !"lastmodified".equals(dtype.getName())) { dtype = dtype.getOrigin(); } if (dtype != null) { ! return localNode.getDateValue(field.getName()); } } } ! return new Date(); } --- 1015,1068 ---- } ! // simple check to prevent remote calls while nothing has to be done ! if (updateRelations || !updatedAfterTimestamp.isEmpty()) { ! Map<Integer,Node> publishedNodesMap = getPublishedNodes(publishInfoNodes); ! Iterator<Integer> cloudNumberIterator = publishedNodesMap.keySet().iterator(); ! ! while(cloudNumberIterator.hasNext()) { ! int remoteCloudNumber = cloudNumberIterator.next(); ! CloudInfo remoteCloudInfo = CloudInfo.getCloudInfo(remoteCloudNumber); ! Node remoteNode = publishedNodesMap.get(remoteCloudNumber); ! ! if (updateNode && updatedAfterTimestamp.contains(localNode.getNumber())) { ! syncNode(localCloudInfo, localNode, remoteCloudInfo, remoteNode); } ! if (updateRelations) { ! if (relatedNodes != null && relatedNodes.size() > 0) { ! syncRelations(localCloudInfo, localNode, remoteCloudInfo, remoteNode, relatedNodes); ! } ! else { ! syncRelations(localCloudInfo, localNode, remoteCloudInfo, remoteNode); ! } } } ! } } } private static Date getLastModifiedDate(Node localNode) { + String fieldname = getFieldNameWithDatatype(localNode, Field.TYPE_DATETIME, "lastmodified"); + if (fieldname != null) { + return localNode.getDateValue(fieldname); + } + return new Date(); + } + + private static String getFieldNameWithDatatype(Node localNode, int fieldType, + String datatypeName) { + String fieldname = null; for (Iterator<Field> iterator = localNode.getNodeManager().getFields().iterator(); iterator.hasNext();) { Field field = iterator.next(); ! if (field.getType() == fieldType) { DataType dtype = field.getDataType(); ! while (dtype != null && !datatypeName.equals(dtype.getName())) { dtype = dtype.getOrigin(); } if (dtype != null) { ! fieldname = field.getName(); } } } ! return fieldname; } *************** *** 1066,1069 **** --- 1079,1083 ---- if (remoteNode != null) { syncFields(localCloudInfo, localNode, remoteCloudInfo, remoteNode); + boolean aliasChanged = syncAliasses(localNode, remoteNode); if (aliasChanged || remoteNode.isChanged()) { *************** *** 1101,1109 **** fieldName.equals("dnumber") || fieldName.equals("rnumber"))) { ! cloneNodeField(localCloudInfo, localNode, remoteCloudInfo, remoteNode, field); } } } private static boolean syncAliasses(Node localNode, Node remoteNode) { StringList list = localNode.getAliases(); --- 1115,1154 ---- fieldName.equals("dnumber") || fieldName.equals("rnumber"))) { ! ! int fieldType = field.getType(); ! if (fieldType == Field.TYPE_BINARY) { ! syncBinaryField(localNode, remoteNode, fieldName); ! } ! else { ! cloneNodeField(localCloudInfo, localNode, remoteCloudInfo, remoteNode, field); ! } } } } + private static void syncBinaryField(Node sourceNode, Node destinationNode, String fieldName) { + boolean syncField = true; + String checksumField = getFieldNameWithDatatype(sourceNode, Field.TYPE_STRING, "checksum"); + if (checksumField != null) { + String localChecksum = sourceNode.getStringValue(checksumField); + try { + String remoteChecksum = destinationNode.getStringValue(checksumField); + if ((localChecksum == null && remoteChecksum == null) + || (localChecksum != null && localChecksum.equals(remoteChecksum))) { + syncField = false; + } + } + catch (Throwable t) { + // The remote side could throw an exception when the field does not exist. + log.debug("Errror while remote checksum check. Node " + destinationNode.getNumber() + " field " + fieldName, t); + } + } + if (syncField) { + destinationNode.setValueWithoutProcess(fieldName, sourceNode + .getValueWithoutProcess(fieldName)); + } + } + + private static boolean syncAliasses(Node localNode, Node remoteNode) { StringList list = localNode.getAliases(); |