Usunięcie użycia podwójnych ukośników w elementach JMX ObjectName.

Ta reguła powoduje oznaczenie potencjalnego użycia podwójnego ukośnika „//” w części nazwy określającej domenę w konstruktorach javax.management.ObjectName. W specyfikacji JSR 255 planowane jest użycie podwójnego ukośnika w części nazwy określającej domenę w konstruktorze javax.management.ObjectName jako separatora na potrzeby „obsługi kaskadowej”. Specyfikacja JSR 255 nie stanowi części środowiska Java SE 6, zaleca się jednak, aby część nazwy obiektu określająca domenę nie zawierała łańcucha „//” w celu uniknięcia w przyszłości problemów z kompatybilnością.

Nazwy obiektów mają następującą postać:

domain:key1=value1,key2=value2,key3=value3,*

ze zmienną liczbą właściwości klucza.

Jeśli aplikacja zawiera komponenty MBean z nazwami obiektów z podwójnym ukośnikiem przy nazwie domeny, konieczna jest zmiana nazwy domeny w tych komponentach.

Ta reguła bada konstruktory ObjectName i w miarę możliwości sprawdza część łańcucha określającą nazwę domeny pod kątem występowania podwójnych ukośników. Jest ona w stanie skanować konstruktory, które przekazują literały łańcuchowe lub zmienną łańcuchową final zdefiniowaną w tej samej jednostce kompilacji. Jeśli reguła ta może sprawdzić nazwę domeny, oznacza jedynie te konstruktory, które naruszają regułę.

Reguła powoduje również oznaczenie wystąpień konstruktora ObjectName z nazwą domeny zakodowaną jako zmienną, która nie jest łatwo dostępna do analizy. Należy ręcznie sprawdzić, czy w wystąpieniach tych nazwy domen nie zawierają podwójnego ukośnika.

Przykład 1:

public MyClass {
import javax.management.ObjectName;

ObjectName myObj1 = ObjectName("domain//Name:key1=value1,*");
ObjectName myObj2 = ObjectName("domaiName", "key1", "value1");
Hashtable<String,String> myHashTable = new Hashtable<String,String>();
table.put("key1", "value1");
ObjectName myObj3 = ObjectName("domain//Name", myHashTable");
}

W przykładzie 1 reguła oznaczy obiekty myObj1 i myObj3, ponieważ zawierają one łańcuchy „//”. Obiekt myObj2 nie zostanie oznaczony.

Przykład 2:

public MyClass {
import javax.management.ObjectName;

final String myDomainName = "domainName";
ObjectName myObj1 = ObjectName(myDomainName, "key1", "value1");

final String myObjectName = "domain//Name:key1=value1";
ObjectName myObj2 = ObjectName(myObjectName);
}

W przykładzie 2 reguła oznaczy obiekt myObj2, lecz nie oznaczy obiektu myObj1.

Przykład 3:

public MyClass {
import javax.management.ObjectName;

private ObjectName getMyObjectName(String myObjectName){
ObjectName myObj = ObjectName(myObjectName);
}
}

W przykładzie 3 obiekt myObj zostanie oznaczony, ponieważ kod nie może określić nazwy domeny.

Informacje dodatkowe znajdują się w następujących zasobach: