@Override public T remove(T entry) { // 将oldEntry的属性entry设置为空。这样,当remove()没有找到删除元素时将返回null ReturnObject oldEntry = new ReturnObject(null); BinaryNodeInterface<T> newRoot = removeEntry(getRootNode(), entry, oldEntry); setRootNode(newRoot); return oldEntry.get(); }
@SuppressWarnings("rawtypes") public ReturnObject getReturnObject(Object object) { ReturnObject returnObject; if (object != null) { if (isPrimitiveObject(object)) { returnObject = ReturnObject.getPrimitiveReturnObject(object); } else if (object == ReflectionEngine.RETURN_VOID) { returnObject = ReturnObject.getVoidReturnObject(); } else if (isList(object)) { String objectId = putNewObject(object); returnObject = ReturnObject.getListReturnObject(objectId, ((List) object).size()); } else if (isMap(object)) { String objectId = putNewObject(object); returnObject = ReturnObject.getMapReturnObject(objectId, ((Map) object).size()); } else if (isArray(object)) { String objectId = putNewObject(object); returnObject = ReturnObject.getArrayReturnObject(objectId, Array.getLength(object)); } else if (isSet(object)) { String objectId = putNewObject(object); returnObject = ReturnObject.getSetReturnObject(objectId, ((Set) object).size()); } else if (isIterator(object)) { String objectId = putNewObject(object); returnObject = ReturnObject.getIteratorReturnObject(objectId); } else { String objectId = putNewObject(object); returnObject = ReturnObject.getReferenceReturnObject(objectId); } } else { returnObject = ReturnObject.getNullReturnObject(); } return returnObject; }
/** * Invokes a method. * * @param methodName * @param targetObjectId * @param args * @return */ public ReturnObject invoke(String methodName, String targetObjectId, List<Object> args) { if (args == null) { args = new ArrayList<Object>(); } ReturnObject returnObject = null; try { Object targetObject = getObjectFromId(targetObjectId); logger.finer("Calling: " + methodName); Object[] parameters = args.toArray(); MethodInvoker method = null; if (targetObject != null) { method = rEngine.getMethod(targetObject, methodName, parameters); } else { method = rEngine.getMethod( targetObjectId.substring(Protocol.STATIC_PREFIX.length()), methodName, parameters); } Object object = rEngine.invoke(targetObject, method, parameters); returnObject = getReturnObject(object); } catch (Py4JJavaException je) { String id = putNewObject(je.getCause()); returnObject = ReturnObject.getErrorReferenceReturnObject(id); } catch (Py4JException pe) { throw pe; } catch (Exception e) { throw new Py4JException(e); } return returnObject; }
// vartika says - to change this tomorrow public void paintRegionOfLevel( Graphics2D g, int dx, int dy, int sx, int sy, int w, int h, int level) throws IOException { // vartika says on 3 august // paintRegion(g, dx, dy, sx, sy, w, h, levelDownsamples[level]); ReturnObject returnObject = paintRegion(sx, sy, w, h, levelDownsamples[level]); // vartika doubt on 3 august - shouldn't this be at client?? -who calls it? g.drawImage(returnObject.getImg(), dx, dy, w, h, null); if (debug) { System.out.println(returnObject.getImg()); if (debugThingy == 0) { g.setColor(new Color(1.0f, 0.0f, 0.0f, 0.4f)); debugThingy = 1; } else { g.setColor(new Color(0.0f, 1.0f, 0.0f, 0.4f)); debugThingy = 0; } g.fillRect(dx, dy, returnObject.getW(), returnObject.getH()); } }
public BufferedImage createThumbnailImage( int x, int y, long w, long h, int maxSize, int bufferedImageType) throws IOException { double ds; if (w > h) { ds = (double) w / maxSize; } else { ds = (double) h / maxSize; } if (ds < 1.0) { ds = 1.0; } int sw = (int) (w / ds); int sh = (int) (h / ds); int sx = (int) (x / ds); int sy = (int) (y / ds); BufferedImage result = new BufferedImage(sw, sh, bufferedImageType); Graphics2D g = result.createGraphics(); // vartika says on 3 august // vartika doubt on 3 august - where is this draw being called from? need to move it to client ReturnObject returnObject = paintRegion(sx, sy, sw, sh, ds); g.drawImage(returnObject.getImg(), 0, 0, returnObject.getW(), returnObject.getH(), null); if (debug) { System.out.println(returnObject.getImg()); if (debugThingy == 0) { g.setColor(new Color(1.0f, 0.0f, 0.0f, 0.4f)); debugThingy = 1; } else { g.setColor(new Color(0.0f, 1.0f, 0.0f, 0.4f)); debugThingy = 0; } g.fillRect(0, 0, returnObject.getW(), returnObject.getH()); } g.dispose(); return result; }
/** * Invokes a constructor and returned the constructed object. * * @param fqn The fully qualified name of the class. * @param args * @return */ public ReturnObject invoke(String fqn, List<Object> args) { if (args == null) { args = new ArrayList<Object>(); } ReturnObject returnObject = null; try { logger.finer("Calling constructor: " + fqn); Object[] parameters = args.toArray(); MethodInvoker method = rEngine.getConstructor(fqn, parameters); Object object = rEngine.invoke(null, method, parameters); returnObject = getReturnObject(object); } catch (Py4JJavaException je) { String id = putNewObject(je.getCause()); returnObject = ReturnObject.getErrorReferenceReturnObject(id); } catch (Py4JException pe) { throw pe; } catch (Exception e) { throw new Py4JException(e); } return returnObject; }
/*由于remove()方法可以删除根结点,因此须保留一个指向树的根的引用 * 因而让removeEntry()返回删除结点后的树的根结点,该树根就可以用remove()来保存了 * 但是,remove()方法删除结点时,它需要返回待删除的结点的值,而具体执行删除操作的removeEntry()返回的是新的树根 * 因此,需要一个内部类ReturnObject来获取被删除结点的值 */ private BinaryNodeInterface<T> removeEntry( BinaryNodeInterface<T> rootNode, T entry, ReturnObject oldEntry) { if (rootNode != null) { T rootData = rootNode.getData(); int comparison = entry.compareTo(rootData); if (comparison == 0) { // 找到了待删除的结点,它相当于"根结点" // 将其对应的数据域放到oldEntry的entry属性中,而在remove方法中调用oldEntry的get方法会得到它 oldEntry.set(rootData); rootNode = removeFromRoot(rootNode); } // end if else if (comparison < 0) { // 待删结点在当前结点的左子树中 BinaryNodeInterface<T> leftChild = rootNode.getLeftChild(); // 递归调用说明:真正删除结点的操作是从树根开始直至找到该结点(相当于找到了以待删结点为根的子树)然后调用removeFromRoot方法进行删除 BinaryNodeInterface<T> subtreeRoot = removeEntry(leftChild, entry, oldEntry); rootNode.setLeftChild(subtreeRoot); // ??? } else { // 待删结点在当前结点的右子树中 BinaryNodeInterface<T> rightChild = rootNode.getRightChild(); BinaryNodeInterface<T> subtreeRoot = removeEntry(rightChild, entry, oldEntry); rootNode.setRightChild(subtreeRoot); // ??? } } // end if return rootNode; }