From: Nico K. <nkl...@us...> - 2006-12-16 13:15:27
|
Update of /cvsroot/mmapps/mmapps/remotepublishing/src/org/mmbase/remotepublishing In directory sc8-pr-cvs7.sourceforge.net:/tmp/cvs-serv7431/remotepublishing/src/org/mmbase/remotepublishing Modified Files: CloudManager.java PublishManager.java PublishListener.java Added Files: CloudInfo.java Log Message: Performance improvements Index: PublishListener.java =================================================================== RCS file: /cvsroot/mmapps/mmapps/remotepublishing/src/org/mmbase/remotepublishing/PublishListener.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** PublishListener.java 17 Oct 2006 10:02:54 -0000 1.1 --- PublishListener.java 16 Dec 2006 13:14:45 -0000 1.2 *************** *** 9,12 **** public interface PublishListener { void published(Node publishedNode); ! void publishedFailed(Node publishedNode); } --- 9,12 ---- public interface PublishListener { void published(Node publishedNode); ! void publishedFailed(Node publishedNode, String systemMessage); } --- NEW FILE: CloudInfo.java --- package org.mmbase.remotepublishing; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.mmbase.bridge.BridgeException; import org.mmbase.bridge.Cloud; import org.mmbase.bridge.Node; import org.mmbase.bridge.NodeIterator; import org.mmbase.bridge.implementation.BasicCloud; import org.mmbase.bridge.util.SearchUtil; import org.mmbase.util.logging.Logger; import org.mmbase.util.logging.Logging; public class CloudInfo { private static final Logger log = Logging.getLoggerInstance(CloudInfo.class); public static final String CLOUD = "cloud"; private static final int DEFAULT_CLOUDINFO_NUMBER = Integer.MIN_VALUE; // this map used to cache cloudInfo instance. Cloud (in local) --> CloudInfo private static final Map<Integer, CloudInfo> instanceMap = new HashMap<Integer, CloudInfo>(); private static final Map<Integer, Cloud> cloudMap = new HashMap<Integer, Cloud>(); public static CloudInfo getDefaultCloudInfo() { if (instanceMap.containsKey(DEFAULT_CLOUDINFO_NUMBER)) { return instanceMap.get(DEFAULT_CLOUDINFO_NUMBER); } Cloud localCloud = CloudManager.getAdminCloud(); CloudInfo localCloudInfo = getCloudInfo(localCloud); instanceMap.put(DEFAULT_CLOUDINFO_NUMBER, localCloudInfo); cloudMap.put(localCloudInfo.getNumber(), localCloud); return localCloudInfo; } /** * * @param cloud * @return * @deprecated because this method use getCloudNode(cloud, cloud), it's expensive. */ public static CloudInfo getCloudInfo(Cloud cloud) { Node cloudNode = CloudManager.getCloudNode(cloud, cloud); CloudInfo cloudInfo = getCloudInfo(cloudNode); cloudMap.put(cloudNode.getNumber(), cloud); return cloudInfo; } public static CloudInfo getCloudInfo(int cloudNumber) { if (instanceMap.containsKey(cloudNumber)) { return instanceMap.get(cloudNumber); } CloudInfo localCloudInfo = getDefaultCloudInfo(); Node cloudNode = localCloudInfo.getCloud().getNode(cloudNumber); return getCloudInfo(cloudNode); } /** * * @param remoteCloudInfo * @param remoteCloudNumber * @return * @deprecated */ public static CloudInfo getCloudInfo(CloudInfo remoteCloudInfo, int remoteCloudNumber) { CloudInfo localCloudInfo = CloudInfo.getDefaultCloudInfo(); if (remoteCloudInfo==null || localCloudInfo.equals(remoteCloudInfo)) { return getCloudInfo(remoteCloudNumber); } Node remoteCloudNode = CloudManager.getCloudNodeByNumber(remoteCloudInfo.getCloud(),remoteCloudNumber); String cloudName = remoteCloudNode.getStringValue("name"); Node cloudNode = CloudManager.getCloudNodeByName(localCloudInfo.getCloud(), cloudName); CloudInfo cloudInfo = getCloudInfo(cloudNode); return cloudInfo; } private static CloudInfo getCloudInfo(Node localCloudNode) { if (instanceMap.containsKey(localCloudNode.getNumber())){ return instanceMap.get(localCloudNode.getNumber()); } if (localCloudNode == null) { throw new BridgeException("can not find cloud with number(" + localCloudNode.getNumber() + ") in default admin cloud "); } if (CLOUD.equals(localCloudNode.getNodeManager().getName()) == false) { throw new BridgeException("the node(" + localCloudNode.getNumber() + ") is not a cloud node "); } CloudInfo cloudInfo = new CloudInfo(); cloudInfo.init(localCloudNode); instanceMap.put(cloudInfo.getNumber(), cloudInfo); return cloudInfo; } /** * * @param remoteCloudName * @return */ public static CloudInfo getCloudInfoByName(String remoteCloudName) { // FIXME: Does every cloud node have same name in different clouds? Node cloudNode = CloudManager.getCloudNodeByName(getDefaultCloudInfo().getCloud(), remoteCloudName); return getCloudInfo(cloudNode); } private String name; private int number; private String rmiurl; private final Map<Integer, Integer> remoteNumberMap = new HashMap<Integer, Integer>(); private CloudInfo() { } private void init(Node cloudNode) { this.name = cloudNode.getStringValue("name"); this.number = cloudNode.getNumber(); this.rmiurl = cloudNode.getStringValue("rmiurl"); } public String getName() { return name; } public int getNumber() { return number; } public String getRmiurl() { return rmiurl; } public Cloud getCloud() { return CloudInfo.getCloud(this.number); } public Integer getNumberInRemoteCloud(int remoteCloudNumber) { if(remoteNumberMap.containsKey(remoteCloudNumber)==false){ //get the name of the cloud CloudInfo remoteCloudInfo = getCloudInfo(remoteCloudNumber); Node nodeInRemoteCloud = CloudManager.getCloudNodeByName(remoteCloudInfo.getCloud(), this.name); int numberInRemoteCloud = nodeInRemoteCloud.getNumber(); remoteNumberMap.put(remoteCloudNumber, numberInRemoteCloud); } return remoteNumberMap.get(remoteCloudNumber); } public Integer getNumberInRemoteCloud(CloudInfo remoteCloudInfo) { return getNumberInRemoteCloud(remoteCloudInfo.getNumber()); } /* public Map<Integer,CloudInfo> getAllRemoteCloudInfo() { Map<Integer, CloudInfo> cloudInfoMap = new HashMap<Integer,CloudInfo>(); NodeIterator nodeIterator = this.getCloud().getNodeManager(CLOUD).getList( "number<>" + this.number, null, null).nodeIterator(); while (nodeIterator.hasNext()) { Node cloudNode = nodeIterator.nextNode(); CloudInfo cloudInfo = CloudInfo.getCloudInfo(cloudNode); cloudInfoMap.put(cloudNode.getNumber(),cloudInfo); } return cloudInfoMap; } */ /** * * @param cloudNumber * @return */ public static Cloud getCloud(int cloudNumber) { if (cloudMap.containsKey(cloudNumber)==false) { cloudMap.put(cloudNumber, CloudManager.getCloud(CloudManager.getAdminCloud(),cloudNumber)); } Cloud cloud = cloudMap.get(cloudNumber); return cloud; } public static int getCloudNumberInRemoteCloud(CloudInfo nameServerCloudInfo, CloudInfo cloudInfo) { CloudInfo localCloudInfo = getDefaultCloudInfo(); if (nameServerCloudInfo.equals(localCloudInfo)) { return cloudInfo.getNumber(); } if (cloudInfo.remoteNumberMap.containsKey(nameServerCloudInfo.getNumber())==false) { Node cloudNode = CloudManager.getCloudNode(nameServerCloudInfo.getCloud(), cloudInfo.getCloud()); cloudInfo.remoteNumberMap.put(nameServerCloudInfo.getNumber(), cloudNode.getNumber()); } return cloudInfo.remoteNumberMap.get(nameServerCloudInfo.getNumber()); } public static void setCloudInvalid(String url) { Iterator<CloudInfo> iterator = instanceMap.values().iterator(); CloudInfo localCloudInfo = getDefaultCloudInfo(); while (iterator.hasNext()) { CloudInfo cloudInfo = iterator.next(); if (url==null || "".equals(url.trim())) { //url==null means set all remote cloud invalid. if (cloudInfo.getNumber()==localCloudInfo.getNumber()) { //if it is local cloud, ignore continue; } log.debug("Found a cached remote cloud (name="+cloudInfo.getName()+", and rmiurl="+url+"), remove it from cloud instance cache"); cloudMap.remove(cloudInfo.getNumber()); } else if (url.equals(cloudInfo.getRmiurl())) { log.debug("Found a cached cloud (name="+cloudInfo.getName()+", and rmiurl="+url+"), remove it from cloud instance cache"); cloudMap.remove(cloudInfo.getName()); break; } } } public static void setRemoteCloudsInvalid() { //set all remote cloud to invalid setCloudInvalid(null); } } Index: CloudManager.java =================================================================== RCS file: /cvsroot/mmapps/mmapps/remotepublishing/src/org/mmbase/remotepublishing/CloudManager.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** CloudManager.java 17 Oct 2006 10:02:54 -0000 1.2 --- CloudManager.java 16 Dec 2006 13:14:45 -0000 1.3 *************** *** 14,18 **** package org.mmbase.remotepublishing; ! import java.util.*; import org.mmbase.bridge.BridgeException; --- 14,21 ---- package org.mmbase.remotepublishing; ! import java.util.HashMap; ! import java.util.Map; ! ! import net.sf.mmapps.modules.cloudprovider.CloudProviderFactory; import org.mmbase.bridge.BridgeException; *************** *** 32,35 **** --- 35,40 ---- private static final String CLOUD = "cloud"; + private static final String CLOUD_DEFAULT = "cloud.default"; + static Logger log = Logging.getLoggerInstance(CloudManager.class.getName()); *************** *** 37,41 **** //Utility class } ! /** * Get a cloud number based on the node name --- 42,46 ---- //Utility class } ! /** * Get a cloud number based on the node name *************** *** 69,74 **** */ public static int getCloudNumber(Cloud nameServerCloud, Cloud cloud) { //get the name of the cloud ! String cloudName = cloud.getNodeByAlias("cloud.default").getStringValue("name"); Node cloudNode = SearchUtil.findNode(nameServerCloud, CLOUD, "name", cloudName); --- 74,84 ---- */ public static int getCloudNumber(Cloud nameServerCloud, Cloud cloud) { + Node cloudNode = getCloudNode(nameServerCloud, cloud); + return cloudNode.getNumber(); + } + + public static Node getCloudNode(Cloud nameServerCloud, Cloud cloud) { //get the name of the cloud ! String cloudName = cloud.getNodeByAlias(CLOUD_DEFAULT).getStringValue("name"); Node cloudNode = SearchUtil.findNode(nameServerCloud, CLOUD, "name", cloudName); *************** *** 76,80 **** throw new BridgeException("remote cloud's number could not be established"); } ! return cloudNode.getNumber(); } --- 86,90 ---- throw new BridgeException("remote cloud's number could not be established"); } ! return cloudNode; } *************** *** 84,99 **** * * @param nameServerCloud the cloud containing the cloud nodes to use ! * @param name the name of the cloud ( in the cloud list) * @return cloud instance * @throws BridgeException if the cloud was not found */ ! public static Cloud getCloud(Cloud nameServerCloud, String name) throws BridgeException { ! Node cloud = SearchUtil.findNode(nameServerCloud, CLOUD, "name", name); ! if (cloud == null) { throw new BridgeException("can not find cloud with name(" + name + ") in nameServerCloud"); } ! return getCloudFromNode(cloud); } --- 94,114 ---- * * @param nameServerCloud the cloud containing the cloud nodes to use ! * @param cloudName the name of the cloud ( in the cloud list) * @return cloud instance * @throws BridgeException if the cloud was not found */ ! public static Cloud getCloud(Cloud nameServerCloud, String cloudName) throws BridgeException { ! Node cloudNode = getCloudNodeByName(nameServerCloud, cloudName); ! return getCloudFromNode(cloudNode); ! } ! ! public static Node getCloudNodeByName(Cloud nameServerCloud, String name) throws BridgeException { ! Node cloudNode = SearchUtil.findNode(nameServerCloud, CLOUD, "name", name); ! if (cloudNode == null) { throw new BridgeException("can not find cloud with name(" + name + ") in nameServerCloud"); } ! return cloudNode; } *************** *** 102,120 **** * * @param nameServerCloud name cloud containing the cloud nodes to use ! * @param alias node number of alias of the cloud node * @return cloud instance * @throws BridgeException if the node does not exist */ ! public static Cloud getCloudByAlias(Cloud nameServerCloud, String alias) throws BridgeException { ! Node node = nameServerCloud.getNode(alias); ! if (node == null) { ! throw new BridgeException("Can not find cloud with alias(" ! + alias ! + ") in the nameServerCloud"); } ! return getCloudFromNode(node); } /** * Get a cloud object based on the node number --- 117,148 ---- * * @param nameServerCloud name cloud containing the cloud nodes to use ! * @param cloudAlias node number of alias of the cloud node * @return cloud instance * @throws BridgeException if the node does not exist */ ! public static Cloud getCloudByAlias(Cloud nameServerCloud, String cloudAlias) throws BridgeException { ! Node cloudNode = getCloudNodeByAlias(nameServerCloud, cloudAlias); ! return getCloudFromNode(cloudNode); ! } ! protected static Node getCloudNodeByAlias(Cloud nameServerCloud, String alias) throws BridgeException { ! Node cloudNode = nameServerCloud.getNode(alias); ! ! if (cloudNode == null) { ! throw new BridgeException("Can not find cloud with alias(" + alias ! + ") in the nameServerCloud"); } ! return cloudNode; } + public static Cloud getCloudWithName(Cloud cloud, String name) { + Node defaultCloud = cloud.getNode("cloud.default"); + if (name.equals(defaultCloud.getStringValue("name"))) { + return cloud; + } + int cloudNumber = CloudManager.getCloudNumber(cloud, name); + return CloudManager.getCloud(cloud, cloudNumber); + } + /** * Get a cloud object based on the node number *************** *** 134,137 **** --- 162,175 ---- return getCloudFromNode(node); } + + public static Node getCloudNodeByNumber(Cloud nameServerCloud, int number) throws BridgeException { + Node cloudNode = nameServerCloud.getNode(number); + if (cloudNode == null) { + throw new BridgeException("Can not find cloud with number(" + + number + + ") in the nameServerCloud"); + } + return cloudNode; + } /** *************** *** 142,146 **** * @return cloud instance */ ! private static Cloud getCloudFromNode(Node cloudNode) { if (!cloudNode.getNodeManager().getName().equals(CLOUD)) { throw new BridgeException("does not point to a cloud node"); --- 180,184 ---- * @return cloud instance */ ! public static Cloud getCloudFromNode(Node cloudNode) { if (!cloudNode.getNodeManager().getName().equals(CLOUD)) { throw new BridgeException("does not point to a cloud node"); *************** *** 154,158 **** if ((username != null) && !username.equals("")) { ! Map user = new HashMap(); user.put("username", username); user.put("password", password); --- 192,196 ---- if ((username != null) && !username.equals("")) { ! Map<String, String> user = new HashMap<String, String>(); user.put("username", username); user.put("password", password); *************** *** 161,163 **** --- 199,206 ---- return cloudContext.getCloud("mmbase"); } + + public static Cloud getAdminCloud() { + return CloudProviderFactory.getCloudProvider().getAdminCloud(); + } + } Index: PublishManager.java =================================================================== RCS file: /cvsroot/mmapps/mmapps/remotepublishing/src/org/mmbase/remotepublishing/PublishManager.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** PublishManager.java 17 Oct 2006 10:02:54 -0000 1.3 --- PublishManager.java 16 Dec 2006 13:14:45 -0000 1.4 *************** *** 14,19 **** --- 14,25 ---- package org.mmbase.remotepublishing; + import java.util.ArrayList; import java.util.Collection; + import java.util.HashMap; import java.util.HashSet; + import java.util.Date; + import java.util.Iterator; + import java.util.List; [...1508 lines suppressed...] } ! unLinkNode(localCloud, remoteNode.getCloud(), remoteNode.getNumber()); remoteNode.delete(); } } --- 1058,1069 ---- } ! unLinkNode(localCloudInfo, remoteCloudInfo, remoteNode.getNumber()); remoteNode.delete(); } + public static void unLinkImportedNode(int number) { + CloudInfo localCloudInfo = CloudInfo.getDefaultCloudInfo(); + unLinkNode(localCloudInfo, localCloudInfo.getCloud().getNode(number)); + } + } |