提交 be479f20 编写于 作者: W wetmore

Merge

...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
package com.sun.jmx.mbeanserver; package com.sun.jmx.mbeanserver;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
...@@ -113,4 +114,32 @@ public class Util { ...@@ -113,4 +114,32 @@ public class Util {
public static <T> T cast(Object x) { public static <T> T cast(Object x) {
return (T) x; return (T) x;
} }
/**
* Computes a descriptor hashcode from its names and values.
* @param names the sorted array of descriptor names.
* @param values the array of descriptor values.
* @return a hash code value, as described in {@link #hashCode(Descriptor)}
*/
public static int hashCode(String[] names, Object[] values) {
int hash = 0;
for (int i = 0; i < names.length; i++) {
Object v = values[i];
int h;
if (v == null) {
h = 0;
} else if (v instanceof Object[]) {
h = Arrays.deepHashCode((Object[]) v);
} else if (v.getClass().isArray()) {
h = Arrays.deepHashCode(new Object[]{v}) - 31;
// hashcode of a list containing just v is
// v.hashCode() + 31, see List.hashCode()
} else {
h = v.hashCode();
}
hash += names[i].toLowerCase().hashCode() ^ h;
}
return hash;
}
} }
/* /*
* Copyright 2004-2006 Sun Microsystems, Inc. All Rights Reserved. * Copyright 2004-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
package javax.management; package javax.management;
import com.sun.jmx.mbeanserver.Util;
import java.io.InvalidObjectException; import java.io.InvalidObjectException;
import java.lang.reflect.Array; import java.lang.reflect.Array;
import java.util.Arrays; import java.util.Arrays;
...@@ -362,6 +363,7 @@ public class ImmutableDescriptor implements Descriptor { ...@@ -362,6 +363,7 @@ public class ImmutableDescriptor implements Descriptor {
*/ */
// Note: this Javadoc is copied from javax.management.Descriptor // Note: this Javadoc is copied from javax.management.Descriptor
// due to 6369229. // due to 6369229.
@Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (o == this) if (o == this)
return true; return true;
...@@ -410,29 +412,15 @@ public class ImmutableDescriptor implements Descriptor { ...@@ -410,29 +412,15 @@ public class ImmutableDescriptor implements Descriptor {
*/ */
// Note: this Javadoc is copied from javax.management.Descriptor // Note: this Javadoc is copied from javax.management.Descriptor
// due to 6369229. // due to 6369229.
@Override
public int hashCode() { public int hashCode() {
if (hashCode == -1) { if (hashCode == -1) {
int hash = 0; hashCode = Util.hashCode(names, values);
for (int i = 0; i < names.length; i++) {
Object v = values[i];
int h;
if (v == null)
h = 0;
else if (v instanceof Object[])
h = Arrays.deepHashCode((Object[]) v);
else if (v.getClass().isArray()) {
h = Arrays.deepHashCode(new Object[] {v}) - 31;
// hashcode of a list containing just v is
// v.hashCode() + 31, see List.hashCode()
} else
h = v.hashCode();
hash += names[i].toLowerCase().hashCode() ^ h;
}
hashCode = hash;
} }
return hashCode; return hashCode;
} }
@Override
public String toString() { public String toString() {
StringBuilder sb = new StringBuilder("{"); StringBuilder sb = new StringBuilder("{");
for (int i = 0; i < names.length; i++) { for (int i = 0; i < names.length; i++) {
...@@ -479,6 +467,7 @@ public class ImmutableDescriptor implements Descriptor { ...@@ -479,6 +467,7 @@ public class ImmutableDescriptor implements Descriptor {
* If the descriptor construction fails for any reason, this exception will * If the descriptor construction fails for any reason, this exception will
* be thrown. * be thrown.
*/ */
@Override
public Descriptor clone() { public Descriptor clone() {
return this; return this;
} }
......
...@@ -33,6 +33,7 @@ package javax.management.modelmbean; ...@@ -33,6 +33,7 @@ package javax.management.modelmbean;
import static com.sun.jmx.defaults.JmxProperties.MODELMBEAN_LOGGER; import static com.sun.jmx.defaults.JmxProperties.MODELMBEAN_LOGGER;
import static com.sun.jmx.mbeanserver.Util.cast; import static com.sun.jmx.mbeanserver.Util.cast;
import com.sun.jmx.mbeanserver.GetPropertyAction; import com.sun.jmx.mbeanserver.GetPropertyAction;
import com.sun.jmx.mbeanserver.Util;
import java.io.IOException; import java.io.IOException;
import java.io.ObjectInputStream; import java.io.ObjectInputStream;
...@@ -774,6 +775,7 @@ public class DescriptorSupport ...@@ -774,6 +775,7 @@ public class DescriptorSupport
* fails for any reason, this exception will be thrown. * fails for any reason, this exception will be thrown.
*/ */
@Override
public synchronized Object clone() throws RuntimeOperationsException { public synchronized Object clone() throws RuntimeOperationsException {
if (MODELMBEAN_LOGGER.isLoggable(Level.FINEST)) { if (MODELMBEAN_LOGGER.isLoggable(Level.FINEST)) {
MODELMBEAN_LOGGER.logp(Level.FINEST, MODELMBEAN_LOGGER.logp(Level.FINEST,
...@@ -814,13 +816,16 @@ public class DescriptorSupport ...@@ -814,13 +816,16 @@ public class DescriptorSupport
* otherwise. * otherwise.
* *
*/ */
// XXXX TODO: This is not very efficient!
// Note: this Javadoc is copied from javax.management.Descriptor // Note: this Javadoc is copied from javax.management.Descriptor
// due to 6369229. // due to 6369229.
@Override
public synchronized boolean equals(Object o) { public synchronized boolean equals(Object o) {
if (o == this) if (o == this)
return true; return true;
if (! (o instanceof Descriptor))
return false;
if (o instanceof ImmutableDescriptor)
return o.equals(this);
return new ImmutableDescriptor(descriptorMap).equals(o); return new ImmutableDescriptor(descriptorMap).equals(o);
} }
...@@ -844,11 +849,16 @@ public class DescriptorSupport ...@@ -844,11 +849,16 @@ public class DescriptorSupport
* @return A hash code value for this object. * @return A hash code value for this object.
* *
*/ */
// XXXX TODO: This is not very efficient!
// Note: this Javadoc is copied from javax.management.Descriptor // Note: this Javadoc is copied from javax.management.Descriptor
// due to 6369229. // due to 6369229.
@Override
public synchronized int hashCode() { public synchronized int hashCode() {
return new ImmutableDescriptor(descriptorMap).hashCode(); final int size = descriptorMap.size();
// descriptorMap is sorted with a comparator that ignores cases.
//
return Util.hashCode(
descriptorMap.keySet().toArray(new String[size]),
descriptorMap.values().toArray(new Object[size]));
} }
/** /**
...@@ -1278,6 +1288,7 @@ public class DescriptorSupport ...@@ -1278,6 +1288,7 @@ public class DescriptorSupport
* field Names or field Values. If the descriptor string fails * field Names or field Values. If the descriptor string fails
* for any reason, this exception will be thrown. * for any reason, this exception will be thrown.
*/ */
@Override
public synchronized String toString() { public synchronized String toString() {
if (MODELMBEAN_LOGGER.isLoggable(Level.FINEST)) { if (MODELMBEAN_LOGGER.isLoggable(Level.FINEST)) {
MODELMBEAN_LOGGER.logp(Level.FINEST, MODELMBEAN_LOGGER.logp(Level.FINEST,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册