History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/javax/management/relation/RelationSupport.java (1 of 18352 files). Show all

Unified · Split

java/pkg/javax/management/relation/RelationSupport.java+1731−0
@@ -0,0 +1,1731 @@
1+/*
2+ * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved.
3+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+ *
5+ * This code is free software; you can redistribute it and/or modify it
6+ * under the terms of the GNU General Public License version 2 only, as
7+ * published by the Free Software Foundation. Oracle designates this
8+ * particular file as subject to the "Classpath" exception as provided
9+ * by Oracle in the LICENSE file that accompanied this code.
10+ *
11+ * This code is distributed in the hope that it will be useful, but WITHOUT
12+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14+ * version 2 for more details (a copy is included in the LICENSE file that
15+ * accompanied this code).
16+ *
17+ * You should have received a copy of the GNU General Public License version
18+ * 2 along with this work; if not, write to the Free Software Foundation,
19+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20+ *
21+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22+ * or visit www.oracle.com if you need additional information or have any
23+ * questions.
24+ */
25+
26+package javax.management.relation;
27+
28+
29+
30+import java.util.ArrayList;
31+
32+import java.util.HashMap;
33+import java.util.Iterator;
34+import java.util.Map;
35+import java.util.List;
36+
37+import java.util.concurrent.atomic.AtomicBoolean;
38+import static com.sun.jmx.defaults.JmxProperties.RELATION_LOGGER;
39+import static com.sun.jmx.mbeanserver.Util.cast;
40+import javax.management.InstanceNotFoundException;
41+import javax.management.MBeanException;
42+import javax.management.MBeanRegistration;
43+import javax.management.MBeanServer;
44+import javax.management.ObjectName;
45+import javax.management.ReflectionException;
46+
47+/**
48+ * A RelationSupport object is used internally by the Relation Service to
49+ * represent simple relations (only roles, no properties or methods), with an
50+ * unlimited number of roles, of any relation type. As internal representation,
51+ * it is not exposed to the user.
52+ * <P>RelationSupport class conforms to the design patterns of standard MBean. So
53+ * the user can decide to instantiate a RelationSupport object himself as
54+ * a MBean (as it follows the MBean design patterns), to register it in the
55+ * MBean Server, and then to add it in the Relation Service.
56+ * <P>The user can also, when creating his own MBean relation class, have it
57+ * extending RelationSupport, to retrieve the implementations of required
58+ * interfaces (see below).
59+ * <P>It is also possible to have in a user relation MBean class a member
60+ * being a RelationSupport object, and to implement the required interfaces by
61+ * delegating all to this member.
62+ * <P> RelationSupport implements the Relation interface (to be handled by the
63+ * Relation Service).
64+ * <P>It implements also the MBeanRegistration interface to be able to retrieve
65+ * the MBean Server where it is registered (if registered as a MBean) to access
66+ * to its Relation Service.
67+ *
68+ * @since 1.5
69+ */
70+public class RelationSupport
71+ implements RelationSupportMBean, MBeanRegistration {
72+
73+ //
74+ // Private members
75+ //
76+
77+ // Relation identifier (expected to be unique in the Relation Service where
78+ // the RelationSupport object will be added)
79+ private String myRelId = null;
80+
81+ // ObjectName of the Relation Service where the relation will be added
82+ // REQUIRED if the RelationSupport is created by the user to be registered as
83+ // a MBean, as it will have to access the Relation Service via the MBean
84+ // Server to perform the check regarding the relation type.
85+ // Is null if current object is directly created by the Relation Service,
86+ // as the object will directly access it.
87+ private ObjectName myRelServiceName = null;
88+
89+ // Reference to the MBean Server where the Relation Service is
90+ // registered
91+ // REQUIRED if the RelationSupport is created by the user to be registered as
92+ // a MBean, as it will have to access the Relation Service via the MBean
93+ // Server to perform the check regarding the relation type.
94+ // If the Relationbase object is created by the Relation Service (use of
95+ // createRelation() method), this is null as not needed, direct access to
96+ // the Relation Service.
97+ // If the Relationbase object is created by the user and registered as a
98+ // MBean, this is set by the preRegister() method below.
99+ private MBeanServer myRelServiceMBeanServer = null;
100+
101+ // Relation type name (must be known in the Relation Service where the
102+ // relation will be added)
103+ private String myRelTypeName = null;
104+
105+ // Role map, mapping <role-name> -> <Role>
106+ // Initialized by role list in the constructor, then updated:
107+ // - if the relation is a MBean, via setRole() and setRoles() methods, or
108+ // via Relation Service setRole() and setRoles() methods
109+ // - if the relation is internal to the Relation Service, via
110+ // setRoleInt() and setRolesInt() methods.
111+ private final Map<String,Role> myRoleName2ValueMap = new HashMap<String,Role>();
112+
113+ // Flag to indicate if the object has been added in the Relation Service
114+ private final AtomicBoolean myInRelServFlg = new AtomicBoolean();
115+
116+ //
117+ // Constructors
118+ //
119+
120+ /**
121+ * Creates a {@code RelationSupport} object.
122+ * <P>This constructor has to be used when the RelationSupport object will
123+ * be registered as a MBean by the user, or when creating a user relation
124+ * MBean whose class extends RelationSupport.
125+ * <P>Nothing is done at the Relation Service level, i.e.
126+ * the {@code RelationSupport} object is not added to the
127+ * {@code RelationService} and no checks are performed to
128+ * see if the provided values are correct.
129+ * The object is always created, EXCEPT if:
130+ * <P>- any of the required parameters is {@code null}.
131+ * <P>- the same name is used for two roles.
132+ * <P>To be handled as a relation, the {@code RelationSupport} object has
133+ * to be added to the Relation Service using the Relation Service method
134+ * addRelation().
135+ *
136+ * @param relationId relation identifier, to identify the relation in the
137+ * Relation Service.
138+ * <P>Expected to be unique in the given Relation Service.
139+ * @param relationServiceName ObjectName of the Relation Service where
140+ * the relation will be registered.
141+ * <P>This parameter is required as it is the Relation Service that is
142+ * aware of the definition of the relation type of the given relation,
143+ * so that will be able to check update operations (set).
144+ * @param relationTypeName Name of relation type.
145+ * <P>Expected to have been created in the given Relation Service.
146+ * @param list list of roles (Role objects) to initialize the
147+ * relation. Can be {@code null}.
148+ * <P>Expected to conform to relation info in associated relation type.
149+ *
150+ * @exception InvalidRoleValueException if the same name is used for two
151+ * roles.
152+ * @exception IllegalArgumentException if any of the required parameters
153+ * (relation id, relation service ObjectName, or relation type name) is
154+ * {@code null}.
155+ */
156+ public RelationSupport(String relationId,
157+ ObjectName relationServiceName,
158+ String relationTypeName,
159+ RoleList list)
160+ throws InvalidRoleValueException,
161+ IllegalArgumentException {
162+
163+ super();
164+
165+ RELATION_LOGGER.entering(RelationSupport.class.getName(),
166+ "RelationSupport");
167+
168+ // Can throw InvalidRoleValueException and IllegalArgumentException
169+ initMembers(relationId,
170+ relationServiceName,
171+ null,
172+ relationTypeName,
173+ list);
174+
175+ RELATION_LOGGER.exiting(RelationSupport.class.getName(),
176+ "RelationSupport");
177+ }
178+
179+ /**
180+ * Creates a {@code RelationSupport} object.
181+ * <P>This constructor has to be used when the user relation MBean
182+ * implements the interfaces expected to be supported by a relation by
183+ * delegating to a RelationSupport object.
184+ * <P>This object needs to know the Relation Service expected to handle the
185+ * relation. So it has to know the MBean Server where the Relation Service
186+ * is registered.
187+ * <P>According to a limitation, a relation MBean must be registered in the
188+ * same MBean Server as the Relation Service expected to handle it. So the
189+ * user relation MBean has to be created and registered, and then the
190+ * wrapped RelationSupport object can be created within the identified MBean
191+ * Server.
192+ * <P>Nothing is done at the Relation Service level, i.e.
193+ * the {@code RelationSupport} object is not added to the
194+ * {@code RelationService} and no checks are performed to
195+ * see if the provided values are correct.
196+ * The object is always created, EXCEPT if:
197+ * <P>- any of the required parameters is {@code null}.
198+ * <P>- the same name is used for two roles.
199+ * <P>To be handled as a relation, the {@code RelationSupport} object has
200+ * to be added to the Relation Service using the Relation Service method
201+ * addRelation().
202+ *
203+ * @param relationId relation identifier, to identify the relation in the
204+ * Relation Service.
205+ * <P>Expected to be unique in the given Relation Service.
206+ * @param relationServiceName ObjectName of the Relation Service where
207+ * the relation will be registered.
208+ * <P>This parameter is required as it is the Relation Service that is
209+ * aware of the definition of the relation type of the given relation,
210+ * so that will be able to check update operations (set).
211+ * @param relationServiceMBeanServer MBean Server where the wrapping MBean
212+ * is or will be registered.
213+ * <P>Expected to be the MBean Server where the Relation Service is or will
214+ * be registered.
215+ * @param relationTypeName Name of relation type.
216+ * <P>Expected to have been created in the given Relation Service.
217+ * @param list list of roles (Role objects) to initialize the
218+ * relation. Can be {@code null}.
219+ * <P>Expected to conform to relation info in associated relation type.
220+ *
221+ * @exception InvalidRoleValueException if the same name is used for two
222+ * roles.
223+ * @exception IllegalArgumentException if any of the required parameters
224+ * (relation id, relation service ObjectName, relation service MBeanServer,
225+ * or relation type name) is {@code null}.
226+ */
227+ public RelationSupport(String relationId,
228+ ObjectName relationServiceName,
229+ MBeanServer relationServiceMBeanServer,
230+ String relationTypeName,
231+ RoleList list)
232+ throws InvalidRoleValueException,
233+ IllegalArgumentException {
234+
235+ super();
236+
237+ if (relationServiceMBeanServer == null) {
238+ String excMsg = "Invalid parameter.";
239+ throw new IllegalArgumentException(excMsg);
240+ }
241+
242+ RELATION_LOGGER.entering(RelationSupport.class.getName(),
243+ "RelationSupport");
244+
245+ // Can throw InvalidRoleValueException and
246+ // IllegalArgumentException
247+ initMembers(relationId,
248+ relationServiceName,
249+ relationServiceMBeanServer,
250+ relationTypeName,
251+ list);
252+
253+ RELATION_LOGGER.exiting(RelationSupport.class.getName(),
254+ "RelationSupport");
255+ }
256+
257+ //
258+ // Relation Interface
259+ //
260+
261+ /**
262+ * Retrieves role value for given role name.
263+ * <P>Checks if the role exists and is readable according to the relation
264+ * type.
265+ *
266+ * @param roleName name of role
267+ *
268+ * @return the ArrayList of ObjectName objects being the role value
269+ *
270+ * @exception IllegalArgumentException if null role name
271+ * @exception RoleNotFoundException if:
272+ * <P>- there is no role with given name
273+ * <P>- the role is not readable.
274+ * @exception RelationServiceNotRegisteredException if the Relation
275+ * Service is not registered in the MBean Server
276+ *
277+ * @see #setRole
278+ */
279+ public List<ObjectName> getRole(String roleName)
280+ throws IllegalArgumentException,
281+ RoleNotFoundException,
282+ RelationServiceNotRegisteredException {
283+
284+ if (roleName == null) {
285+ String excMsg = "Invalid parameter.";
286+ throw new IllegalArgumentException(excMsg);
287+ }
288+
289+ RELATION_LOGGER.entering(RelationSupport.class.getName(),
290+ "getRole", roleName);
291+
292+ // Can throw RoleNotFoundException and
293+ // RelationServiceNotRegisteredException
294+ List<ObjectName> result = cast(
295+ getRoleInt(roleName, false, null, false));
296+
297+ RELATION_LOGGER.exiting(RelationSupport.class.getName(), "getRole");
298+ return result;
299+ }
300+
301+ /**
302+ * Retrieves values of roles with given names.
303+ * <P>Checks for each role if it exists and is readable according to the
304+ * relation type.
305+ *
306+ * @param roleNameArray array of names of roles to be retrieved
307+ *
308+ * @return a RoleResult object, including a RoleList (for roles
309+ * successfully retrieved) and a RoleUnresolvedList (for roles not
310+ * retrieved).
311+ *
312+ * @exception IllegalArgumentException if null role name
313+ * @exception RelationServiceNotRegisteredException if the Relation
314+ * Service is not registered in the MBean Server
315+ *
316+ * @see #setRoles
317+ */
318+ public RoleResult getRoles(String[] roleNameArray)
319+ throws IllegalArgumentException,
320+ RelationServiceNotRegisteredException {
321+
322+ if (roleNameArray == null) {
323+ String excMsg = "Invalid parameter.";
324+ throw new IllegalArgumentException(excMsg);
325+ }
326+
327+ RELATION_LOGGER.entering(RelationSupport.class.getName(), "getRoles");
328+
329+ // Can throw RelationServiceNotRegisteredException
330+ RoleResult result = getRolesInt(roleNameArray, false, null);
331+
332+ RELATION_LOGGER.exiting(RelationSupport.class.getName(), "getRoles");
333+ return result;
334+ }
335+
336+ /**
337+ * Returns all roles present in the relation.
338+ *
339+ * @return a RoleResult object, including a RoleList (for roles
340+ * successfully retrieved) and a RoleUnresolvedList (for roles not
341+ * readable).
342+ *
343+ * @exception RelationServiceNotRegisteredException if the Relation
344+ * Service is not registered in the MBean Server
345+ */
346+ public RoleResult getAllRoles()
347+ throws RelationServiceNotRegisteredException {
348+
349+ RELATION_LOGGER.entering(RelationSupport.class.getName(),
350+ "getAllRoles");
351+
352+ RoleResult result = null;
353+ try {
354+ result = getAllRolesInt(false, null);
355+ } catch (IllegalArgumentException exc) {
356+ // OK : Invalid parameters, ignore...
357+ }
358+
359+ RELATION_LOGGER.exiting(RelationSupport.class.getName(), "getAllRoles");
360+ return result;
361+ }
362+
363+ /**
364+ * Returns all roles in the relation without checking read mode.
365+ *
366+ * @return a RoleList
367+ */
368+ public RoleList retrieveAllRoles() {
369+
370+ RELATION_LOGGER.entering(RelationSupport.class.getName(),
371+ "retrieveAllRoles");
372+
373+ RoleList result;
374+ synchronized(myRoleName2ValueMap) {
375+ result =
376+ new RoleList(new ArrayList<Role>(myRoleName2ValueMap.values()));
377+ }
378+
379+ RELATION_LOGGER.exiting(RelationSupport.class.getName(),
380+ "retrieveAllRoles");
381+ return result;
382+ }
383+
384+ /**
385+ * Returns the number of MBeans currently referenced in the given role.
386+ *
387+ * @param roleName name of role
388+ *
389+ * @return the number of currently referenced MBeans in that role
390+ *
391+ * @exception IllegalArgumentException if null role name
392+ * @exception RoleNotFoundException if there is no role with given name
393+ */
394+ public Integer getRoleCardinality(String roleName)
395+ throws IllegalArgumentException,
396+ RoleNotFoundException {
397+
398+ if (roleName == null) {
399+ String excMsg = "Invalid parameter.";
400+ throw new IllegalArgumentException(excMsg);
401+ }
402+
403+ RELATION_LOGGER.entering(RelationSupport.class.getName(),
404+ "getRoleCardinality", roleName);
405+
406+ // Try to retrieve the role
407+ Role role;
408+ synchronized(myRoleName2ValueMap) {
409+ // No null Role is allowed, so direct use of get()
410+ role = (myRoleName2ValueMap.get(roleName));
411+ }
412+ if (role == null) {
413+ int pbType = RoleStatus.NO_ROLE_WITH_NAME;
414+ // Will throw a RoleNotFoundException
415+ //
416+ // Will not throw InvalidRoleValueException, so catch it for the
417+ // compiler
418+ try {
419+ RelationService.throwRoleProblemException(pbType,
420+ roleName);
421+ } catch (InvalidRoleValueException exc) {
422+ // OK : Do not throw InvalidRoleValueException as
423+ // a RoleNotFoundException will be thrown.
424+ }
425+ }
426+
427+ List<ObjectName> roleValue = role.getRoleValue();
428+
429+ RELATION_LOGGER.exiting(RelationSupport.class.getName(),
430+ "getRoleCardinality");
431+ return roleValue.size();
432+ }
433+
434+ /**
435+ * Sets the given role.
436+ * <P>Will check the role according to its corresponding role definition
437+ * provided in relation's relation type
438+ * <P>Will send a notification (RelationNotification with type
439+ * RELATION_BASIC_UPDATE or RELATION_MBEAN_UPDATE, depending if the
440+ * relation is a MBean or not).
441+ *
442+ * @param role role to be set (name and new value)
443+ *
444+ * @exception IllegalArgumentException if null role
445+ * @exception RoleNotFoundException if there is no role with the supplied
446+ * role's name or if the role is not writable (no test on the write access
447+ * mode performed when initializing the role)
448+ * @exception InvalidRoleValueException if value provided for
449+ * role is not valid, i.e.:
450+ * <P>- the number of referenced MBeans in given value is less than
451+ * expected minimum degree
452+ * <P>- the number of referenced MBeans in provided value exceeds expected
453+ * maximum degree
454+ * <P>- one referenced MBean in the value is not an Object of the MBean
455+ * class expected for that role
456+ * <P>- a MBean provided for that role does not exist
457+ * @exception RelationServiceNotRegisteredException if the Relation
458+ * Service is not registered in the MBean Server
459+ * @exception RelationTypeNotFoundException if the relation type has not
460+ * been declared in the Relation Service
461+ * @exception RelationNotFoundException if the relation has not been
462+ * added in the Relation Service.
463+ *
464+ * @see #getRole
465+ */
466+ public void setRole(Role role)
467+ throws IllegalArgumentException,
468+ RoleNotFoundException,
469+ RelationTypeNotFoundException,
470+ InvalidRoleValueException,
471+ RelationServiceNotRegisteredException,
472+ RelationNotFoundException {
473+
474+ if (role == null) {
475+ String excMsg = "Invalid parameter.";
476+ throw new IllegalArgumentException(excMsg);
477+ }
478+
479+ RELATION_LOGGER.entering(RelationSupport.class.getName(),
480+ "setRole", role);
481+
482+ // Will return null :)
483+ Object result = setRoleInt(role, false, null, false);
484+
485+ RELATION_LOGGER.exiting(RelationSupport.class.getName(), "setRole");
486+ return;
487+ }
488+
489+ /**
490+ * Sets the given roles.
491+ * <P>Will check the role according to its corresponding role definition
492+ * provided in relation's relation type
493+ * <P>Will send one notification (RelationNotification with type
494+ * RELATION_BASIC_UPDATE or RELATION_MBEAN_UPDATE, depending if the
495+ * relation is a MBean or not) per updated role.
496+ *
497+ * @param list list of roles to be set
498+ *
499+ * @return a RoleResult object, including a RoleList (for roles
500+ * successfully set) and a RoleUnresolvedList (for roles not
501+ * set).
502+ *
503+ * @exception IllegalArgumentException if null role list
504+ * @exception RelationServiceNotRegisteredException if the Relation
505+ * Service is not registered in the MBean Server
506+ * @exception RelationTypeNotFoundException if the relation type has not
507+ * been declared in the Relation Service.
508+ * @exception RelationNotFoundException if the relation MBean has not been
509+ * added in the Relation Service.
510+ *
511+ * @see #getRoles
512+ */
513+ public RoleResult setRoles(RoleList list)
514+ throws IllegalArgumentException,
515+ RelationServiceNotRegisteredException,
516+ RelationTypeNotFoundException,
517+ RelationNotFoundException {
518+
519+ if (list == null) {
520+ String excMsg = "Invalid parameter.";
521+ throw new IllegalArgumentException(excMsg);
522+ }
523+
524+ RELATION_LOGGER.entering(RelationSupport.class.getName(),
525+ "setRoles", list);
526+
527+ RoleResult result = setRolesInt(list, false, null);
528+
529+ RELATION_LOGGER.exiting(RelationSupport.class.getName(), "setRoles");
530+ return result;
531+ }
532+
533+ /**
534+ * Callback used by the Relation Service when a MBean referenced in a role
535+ * is unregistered.
536+ * <P>The Relation Service will call this method to let the relation
537+ * take action to reflect the impact of such unregistration.
538+ * <P>BEWARE. the user is not expected to call this method.
539+ * <P>Current implementation is to set the role with its current value
540+ * (list of ObjectNames of referenced MBeans) without the unregistered
541+ * one.
542+ *
543+ * @param objectName ObjectName of unregistered MBean
544+ * @param roleName name of role where the MBean is referenced
545+ *
546+ * @exception IllegalArgumentException if null parameter
547+ * @exception RoleNotFoundException if role does not exist in the
548+ * relation or is not writable
549+ * @exception InvalidRoleValueException if role value does not conform to
550+ * the associated role info (this will never happen when called from the
551+ * Relation Service)
552+ * @exception RelationServiceNotRegisteredException if the Relation
553+ * Service is not registered in the MBean Server
554+ * @exception RelationTypeNotFoundException if the relation type has not
555+ * been declared in the Relation Service.
556+ * @exception RelationNotFoundException if this method is called for a
557+ * relation MBean not added in the Relation Service.
558+ */
559+ public void handleMBeanUnregistration(ObjectName objectName,
560+ String roleName)
561+ throws IllegalArgumentException,
562+ RoleNotFoundException,
563+ InvalidRoleValueException,
564+ RelationServiceNotRegisteredException,
565+ RelationTypeNotFoundException,
566+ RelationNotFoundException {
567+
568+ if (objectName == null || roleName == null) {
569+ String excMsg = "Invalid parameter.";
570+ throw new IllegalArgumentException(excMsg);
571+ }
572+
573+ RELATION_LOGGER.entering(RelationSupport.class.getName(),
574+ "handleMBeanUnregistration",
575+ new Object[]{objectName, roleName});
576+
577+ // Can throw RoleNotFoundException, InvalidRoleValueException,
578+ // or RelationTypeNotFoundException
579+ handleMBeanUnregistrationInt(objectName,
580+ roleName,
581+ false,
582+ null);
583+
584+ RELATION_LOGGER.exiting(RelationSupport.class.getName(),
585+ "handleMBeanUnregistration");
586+ return;
587+ }
588+
589+ /**
590+ * Retrieves MBeans referenced in the various roles of the relation.
591+ *
592+ * @return a HashMap mapping:
593+ * <P> ObjectName -> ArrayList of String (role names)
594+ */
595+ public Map<ObjectName,List<String>> getReferencedMBeans() {
596+
597+ RELATION_LOGGER.entering(RelationSupport.class.getName(),
598+ "getReferencedMBeans");
599+
600+ Map<ObjectName,List<String>> refMBeanMap =
601+ new HashMap<ObjectName,List<String>>();
602+
603+ synchronized(myRoleName2ValueMap) {
604+
605+ for (Role currRole : myRoleName2ValueMap.values()) {
606+
607+ String currRoleName = currRole.getRoleName();
608+ // Retrieves ObjectNames of MBeans referenced in current role
609+ List<ObjectName> currRefMBeanList = currRole.getRoleValue();
610+
611+ for (ObjectName currRoleObjName : currRefMBeanList) {
612+
613+ // Sees if current MBean has been already referenced in
614+ // roles already seen
615+ List<String> mbeanRoleNameList =
616+ refMBeanMap.get(currRoleObjName);
617+
618+ boolean newRefFlg = false;
619+ if (mbeanRoleNameList == null) {
620+ newRefFlg = true;
621+ mbeanRoleNameList = new ArrayList<String>();
622+ }
623+ mbeanRoleNameList.add(currRoleName);
624+ if (newRefFlg) {
625+ refMBeanMap.put(currRoleObjName, mbeanRoleNameList);
626+ }
627+ }
628+ }
629+ }
630+
631+ RELATION_LOGGER.exiting(RelationSupport.class.getName(),
632+ "getReferencedMBeans");
633+ return refMBeanMap;
634+ }
635+
636+ /**
637+ * Returns name of associated relation type.
638+ */
639+ public String getRelationTypeName() {
640+ return myRelTypeName;
641+ }
642+
643+ /**
644+ * Returns ObjectName of the Relation Service handling the relation.
645+ *
646+ * @return the ObjectName of the Relation Service.
647+ */
648+ public ObjectName getRelationServiceName() {
649+ return myRelServiceName;
650+ }
651+
652+ /**
653+ * Returns relation identifier (used to uniquely identify the relation
654+ * inside the Relation Service).
655+ *
656+ * @return the relation id.
657+ */
658+ public String getRelationId() {
659+ return myRelId;
660+ }
661+
662+ //
663+ // MBeanRegistration interface
664+ //
665+
666+ // Pre-registration: retrieves the MBean Server (useful to access to the
667+ // Relation Service)
668+ // This is the way to retrieve the MBean Server when the relation object is
669+ // a MBean created by the user outside of the Relation Service.
670+ //
671+ // No exception thrown.
672+ public ObjectName preRegister(MBeanServer server,
673+ ObjectName name)
674+ throws Exception {
675+
676+ myRelServiceMBeanServer = server;
677+ return name;
678+ }
679+
680+ // Post-registration: does nothing
681+ public void postRegister(Boolean registrationDone) {
682+ return;
683+ }
684+
685+ // Pre-unregistration: does nothing
686+ public void preDeregister()
687+ throws Exception {
688+ return;
689+ }
690+
691+ // Post-unregistration: does nothing
692+ public void postDeregister() {
693+ return;
694+ }
695+
696+ //
697+ // Others
698+ //
699+
700+ /**
701+ * Returns an internal flag specifying if the object is still handled by
702+ * the Relation Service.
703+ */
704+ public Boolean isInRelationService() {
705+ return myInRelServFlg.get();
706+ }
707+
708+ public void setRelationServiceManagementFlag(Boolean flag)
709+ throws IllegalArgumentException {
710+
711+ if (flag == null) {
712+ String excMsg = "Invalid parameter.";
713+ throw new IllegalArgumentException(excMsg);
714+ }
715+ myInRelServFlg.set(flag);
716+ }
717+
718+ //
719+ // Misc
720+ //
721+
722+ // Gets the role with given name
723+ // Checks if the role exists and is readable according to the relation
724+ // type.
725+ //
726+ // This method is called in getRole() above.
727+ // It is also called in the Relation Service getRole() method.
728+ // It is also called in getRolesInt() below (used for getRoles() above
729+ // and for Relation Service getRoles() method).
730+ //
731+ // Depending on parameters reflecting its use (either in the scope of
732+ // getting a single role or of getting several roles), will return:
733+ // - in case of success:
734+ // - for single role retrieval, the ArrayList of ObjectNames being the
735+ // role value
736+ // - for multi-role retrieval, the Role object itself
737+ // - in case of failure (except critical exceptions):
738+ // - for single role retrieval, if role does not exist or is not
739+ // readable, an RoleNotFoundException exception is raised
740+ // - for multi-role retrieval, a RoleUnresolved object
741+ //
742+ // -param roleName name of role to be retrieved
743+ // -param relationServCallFlg true if call from the Relation Service; this
744+ // will happen if the current RelationSupport object has been created by
745+ // the Relation Service (via createRelation()) method, so direct access is
746+ // possible.
747+ // -param relationServ reference to Relation Service object, if object
748+ // created by Relation Service.
749+ // -param multiRoleFlg true if getting the role in the scope of a
750+ // multiple retrieval.
751+ //
752+ // -return:
753+ // - for single role retrieval (multiRoleFlg false):
754+ // - ArrayList of ObjectName objects, value of role with given name, if
755+ // the role can be retrieved
756+ // - raise a RoleNotFoundException exception else
757+ // - for multi-role retrieval (multiRoleFlg true):
758+ // - the Role object for given role name if role can be retrieved
759+ // - a RoleUnresolved object with problem.
760+ //
761+ // -exception IllegalArgumentException if null parameter
762+ // -exception RoleNotFoundException if multiRoleFlg is false and:
763+ // - there is no role with given name
764+ // or
765+ // - the role is not readable.
766+ // -exception RelationServiceNotRegisteredException if the Relation
767+ // Service is not registered in the MBean Server
768+ Object getRoleInt(String roleName,
769+ boolean relationServCallFlg,
770+ RelationService relationServ,
771+ boolean multiRoleFlg)
772+ throws IllegalArgumentException,
773+ RoleNotFoundException,
774+ RelationServiceNotRegisteredException {
775+
776+ if (roleName == null ||
777+ (relationServCallFlg && relationServ == null)) {
778+ String excMsg = "Invalid parameter.";
779+ throw new IllegalArgumentException(excMsg);
780+ }
781+
782+ RELATION_LOGGER.entering(RelationSupport.class.getName(),
783+ "getRoleInt", roleName);
784+
785+ int pbType = 0;
786+
787+ Role role;
788+ synchronized(myRoleName2ValueMap) {
789+ // No null Role is allowed, so direct use of get()
790+ role = (myRoleName2ValueMap.get(roleName));
791+ }
792+
793+ if (role == null) {
794+ pbType = RoleStatus.NO_ROLE_WITH_NAME;
795+
796+ } else {
797+ // Checks if the role is readable
798+ Integer status;
799+
800+ if (relationServCallFlg) {
801+
802+ // Call from the Relation Service, so direct access to it,
803+ // avoiding MBean Server
804+ // Shall not throw a RelationTypeNotFoundException
805+ try {
806+ status = relationServ.checkRoleReading(roleName,
807+ myRelTypeName);
808+ } catch (RelationTypeNotFoundException exc) {
809+ throw new RuntimeException(exc.getMessage());
810+ }
811+
812+ } else {
813+
814+ // Call from getRole() method above
815+ // So we have a MBean. We must access the Relation Service
816+ // via the MBean Server.
817+ Object[] params = new Object[2];
818+ params[0] = roleName;
819+ params[1] = myRelTypeName;
820+ String[] signature = new String[2];
821+ signature[0] = "java.lang.String";
822+ signature[1] = "java.lang.String";
823+ // Can throw InstanceNotFoundException if the Relation
824+ // Service is not registered (to be catched in any case and
825+ // transformed into RelationServiceNotRegisteredException).
826+ //
827+ // Shall not throw a MBeanException, or a ReflectionException
828+ // or an InstanceNotFoundException
829+ try {
830+ status = (Integer)
831+ (myRelServiceMBeanServer.invoke(myRelServiceName,
832+ "checkRoleReading",
833+ params,
834+ signature));
835+ } catch (MBeanException exc1) {
836+ throw new RuntimeException("incorrect relation type");
837+ } catch (ReflectionException exc2) {
838+ throw new RuntimeException(exc2.getMessage());
839+ } catch (InstanceNotFoundException exc3) {
840+ throw new RelationServiceNotRegisteredException(
841+ exc3.getMessage());
842+ }
843+ }
844+
845+ pbType = status.intValue();
846+ }
847+
848+ Object result;
849+
850+ if (pbType == 0) {
851+ // Role can be retrieved
852+
853+ if (!(multiRoleFlg)) {
854+ // Single role retrieved: returns its value
855+ // Note: no need to test if role value (list) not null before
856+ // cloning, null value not allowed, empty list if
857+ // nothing.
858+ result = new ArrayList<ObjectName>(role.getRoleValue());
859+
860+ } else {
861+ // Role retrieved during multi-role retrieval: returns the
862+ // role
863+ result = (Role)(role.clone());
864+ }
865+
866+ } else {
867+ // Role not retrieved
868+
869+ if (!(multiRoleFlg)) {
870+ // Problem when retrieving a simple role: either role not
871+ // found or not readable, so raises a RoleNotFoundException.
872+ try {
873+ RelationService.throwRoleProblemException(pbType,
874+ roleName);
875+ // To keep compiler happy :)
876+ return null;
877+ } catch (InvalidRoleValueException exc) {
878+ throw new RuntimeException(exc.getMessage());
879+ }
880+
881+ } else {
882+ // Problem when retrieving a role in a multi-role retrieval:
883+ // returns a RoleUnresolved object
884+ result = new RoleUnresolved(roleName, null, pbType);
885+ }
886+ }
887+
888+ RELATION_LOGGER.exiting(RelationSupport.class.getName(), "getRoleInt");
889+ return result;
890+ }
891+
892+ // Gets the given roles
893+ // For each role, verifies if the role exists and is readable according to
894+ // the relation type.
895+ //
896+ // This method is called in getRoles() above and in Relation Service
897+ // getRoles() method.
898+ //
899+ // -param roleNameArray array of names of roles to be retrieved
900+ // -param relationServCallFlg true if call from the Relation Service; this
901+ // will happen if the current RelationSupport object has been created by
902+ // the Relation Service (via createRelation()) method, so direct access is
903+ // possible.
904+ // -param relationServ reference to Relation Service object, if object
905+ // created by Relation Service.
906+ //
907+ // -return a RoleResult object
908+ //
909+ // -exception IllegalArgumentException if null parameter
910+ // -exception RelationServiceNotRegisteredException if the Relation
911+ // Service is not registered in the MBean Server
912+ RoleResult getRolesInt(String[] roleNameArray,
913+ boolean relationServCallFlg,
914+ RelationService relationServ)
915+ throws IllegalArgumentException,
916+ RelationServiceNotRegisteredException {
917+
918+ if (roleNameArray == null ||
919+ (relationServCallFlg && relationServ == null)) {
920+ String excMsg = "Invalid parameter.";
921+ throw new IllegalArgumentException(excMsg);
922+ }
923+
924+ RELATION_LOGGER.entering(RelationSupport.class.getName(),
925+ "getRolesInt");
926+
927+ RoleList roleList = new RoleList();
928+ RoleUnresolvedList roleUnresList = new RoleUnresolvedList();
929+
930+ for (int i = 0; i < roleNameArray.length; i++) {
931+ String currRoleName = roleNameArray[i];
932+
933+ Object currResult;
934+
935+ // Can throw RelationServiceNotRegisteredException
936+ //
937+ // RoleNotFoundException: not possible but catch it for compiler :)
938+ try {
939+ currResult = getRoleInt(currRoleName,
940+ relationServCallFlg,
941+ relationServ,
942+ true);
943+
944+ } catch (RoleNotFoundException exc) {
945+ return null; // :)
946+ }
947+
948+ if (currResult instanceof Role) {
949+ // Can throw IllegalArgumentException if role is null
950+ // (normally should not happen :(
951+ try {
952+ roleList.add((Role)currResult);
953+ } catch (IllegalArgumentException exc) {
954+ throw new RuntimeException(exc.getMessage());
955+ }
956+
957+ } else if (currResult instanceof RoleUnresolved) {
958+ // Can throw IllegalArgumentException if role is null
959+ // (normally should not happen :(
960+ try {
961+ roleUnresList.add((RoleUnresolved)currResult);
962+ } catch (IllegalArgumentException exc) {
963+ throw new RuntimeException(exc.getMessage());
964+ }
965+ }
966+ }
967+
968+ RoleResult result = new RoleResult(roleList, roleUnresList);
969+ RELATION_LOGGER.exiting(RelationSupport.class.getName(),
970+ "getRolesInt");
971+ return result;
972+ }
973+
974+ // Returns all roles present in the relation
975+ //
976+ // -return a RoleResult object, including a RoleList (for roles
977+ // successfully retrieved) and a RoleUnresolvedList (for roles not
978+ // readable).
979+ //
980+ // -exception IllegalArgumentException if null parameter
981+ // -exception RelationServiceNotRegisteredException if the Relation
982+ // Service is not registered in the MBean Server
983+ //
984+ RoleResult getAllRolesInt(boolean relationServCallFlg,
985+ RelationService relationServ)
986+ throws IllegalArgumentException,
987+ RelationServiceNotRegisteredException {
988+
989+ if (relationServCallFlg && relationServ == null) {
990+ String excMsg = "Invalid parameter.";
991+ throw new IllegalArgumentException(excMsg);
992+ }
993+
994+ RELATION_LOGGER.entering(RelationSupport.class.getName(),
995+ "getAllRolesInt");
996+
997+ List<String> roleNameList;
998+ synchronized(myRoleName2ValueMap) {
999+ roleNameList =
1000+ new ArrayList<String>(myRoleName2ValueMap.keySet());
1001+ }
1002+ String[] roleNames = new String[roleNameList.size()];
1003+ roleNameList.toArray(roleNames);
1004+
1005+ RoleResult result = getRolesInt(roleNames,
1006+ relationServCallFlg,
1007+ relationServ);
1008+
1009+ RELATION_LOGGER.exiting(RelationSupport.class.getName(),
1010+ "getAllRolesInt");
1011+ return result;
1012+ }
1013+
1014+ // Sets the role with given value
1015+ //
1016+ // This method is called in setRole() above.
1017+ // It is also called by the Relation Service setRole() method.
1018+ // It is also called in setRolesInt() method below (used in setRoles()
1019+ // above and in RelationService setRoles() method).
1020+ //
1021+ // Will check the role according to its corresponding role definition
1022+ // provided in relation's relation type
1023+ // Will send a notification (RelationNotification with type
1024+ // RELATION_BASIC_UPDATE or RELATION_MBEAN_UPDATE, depending if the
1025+ // relation is a MBean or not) if not initialization of role.
1026+ //
1027+ // -param aRole role to be set (name and new value)
1028+ // -param relationServCallFlg true if call from the Relation Service; this
1029+ // will happen if the current RelationSupport object has been created by
1030+ // the Relation Service (via createRelation()) method, so direct access is
1031+ // possible.
1032+ // -param relationServ reference to Relation Service object, if internal
1033+ // relation
1034+ // -param multiRoleFlg true if getting the role in the scope of a
1035+ // multiple retrieval.
1036+ //
1037+ // -return (except other "critical" exceptions):
1038+ // - for single role retrieval (multiRoleFlg false):
1039+ // - null if the role has been set
1040+ // - raise an InvalidRoleValueException
1041+ // else
1042+ // - for multi-role retrieval (multiRoleFlg true):
1043+ // - the Role object for given role name if role has been set
1044+ // - a RoleUnresolved object with problem else.
1045+ //
1046+ // -exception IllegalArgumentException if null parameter
1047+ // -exception RoleNotFoundException if multiRoleFlg is false and:
1048+ // - internal relation and the role does not exist
1049+ // or
1050+ // - existing role (i.e. not initializing it) and the role is not
1051+ // writable.
1052+ // -exception InvalidRoleValueException ifmultiRoleFlg is false and
1053+ // value provided for:
1054+ // - the number of referenced MBeans in given value is less than
1055+ // expected minimum degree
1056+ // or
1057+ // - the number of referenced MBeans in provided value exceeds expected
1058+ // maximum degree
1059+ // or
1060+ // - one referenced MBean in the value is not an Object of the MBean
1061+ // class expected for that role
1062+ // or
1063+ // - a MBean provided for that role does not exist
1064+ // -exception RelationServiceNotRegisteredException if the Relation
1065+ // Service is not registered in the MBean Server
1066+ // -exception RelationTypeNotFoundException if relation type unknown
1067+ // -exception RelationNotFoundException if a relation MBean has not been
1068+ // added in the Relation Service
1069+ Object setRoleInt(Role aRole,
1070+ boolean relationServCallFlg,
1071+ RelationService relationServ,
1072+ boolean multiRoleFlg)
1073+ throws IllegalArgumentException,
1074+ RoleNotFoundException,
1075+ InvalidRoleValueException,
1076+ RelationServiceNotRegisteredException,
1077+ RelationTypeNotFoundException,
1078+ RelationNotFoundException {
1079+
1080+ if (aRole == null ||
1081+ (relationServCallFlg && relationServ == null)) {
1082+ String excMsg = "Invalid parameter.";
1083+ throw new IllegalArgumentException(excMsg);
1084+ }
1085+
1086+ RELATION_LOGGER.entering(RelationSupport.class.getName(),
1087+ "setRoleInt", new Object[] {aRole, relationServCallFlg,
1088+ relationServ, multiRoleFlg});
1089+
1090+ String roleName = aRole.getRoleName();
1091+ int pbType = 0;
1092+
1093+ // Checks if role exists in the relation
1094+ // No error if the role does not exist in the relation, to be able to
1095+ // handle initialization of role when creating the relation
1096+ // (roles provided in the RoleList parameter are directly set but
1097+ // roles automatically initialized are set using setRole())
1098+ Role role;
1099+ synchronized(myRoleName2ValueMap) {
1100+ role = (myRoleName2ValueMap.get(roleName));
1101+ }
1102+
1103+ List<ObjectName> oldRoleValue;
1104+ Boolean initFlg;
1105+
1106+ if (role == null) {
1107+ initFlg = true;
1108+ oldRoleValue = new ArrayList<ObjectName>();
1109+
1110+ } else {
1111+ initFlg = false;
1112+ oldRoleValue = role.getRoleValue();
1113+ }
1114+
1115+ // Checks if the role can be set: is writable (except if
1116+ // initialization) and correct value
1117+ try {
1118+ Integer status;
1119+
1120+ if (relationServCallFlg) {
1121+
1122+ // Call from the Relation Service, so direct access to it,
1123+ // avoiding MBean Server
1124+ //
1125+ // Shall not raise a RelationTypeNotFoundException
1126+ status = relationServ.checkRoleWriting(aRole,
1127+ myRelTypeName,
1128+ initFlg);
1129+
1130+ } else {
1131+
1132+ // Call from setRole() method above
1133+ // So we have a MBean. We must access the Relation Service
1134+ // via the MBean Server.
1135+ Object[] params = new Object[3];
1136+ params[0] = aRole;
1137+ params[1] = myRelTypeName;
1138+ params[2] = initFlg;
1139+ String[] signature = new String[3];
1140+ signature[0] = "javax.management.relation.Role";
1141+ signature[1] = "java.lang.String";
1142+ signature[2] = "java.lang.Boolean";
1143+ // Can throw InstanceNotFoundException if the Relation Service
1144+ // is not registered (to be transformed into
1145+ // RelationServiceNotRegisteredException in any case).
1146+ //
1147+ // Can throw a MBeanException wrapping a
1148+ // RelationTypeNotFoundException:
1149+ // throw wrapped exception.
1150+ //
1151+ // Shall not throw a ReflectionException
1152+ status = (Integer)
1153+ (myRelServiceMBeanServer.invoke(myRelServiceName,
1154+ "checkRoleWriting",
1155+ params,
1156+ signature));
1157+ }
1158+
1159+ pbType = status.intValue();
1160+
1161+ } catch (MBeanException exc2) {
1162+
1163+ // Retrieves underlying exception
1164+ Exception wrappedExc = exc2.getTargetException();
1165+ if (wrappedExc instanceof RelationTypeNotFoundException) {
1166+ throw ((RelationTypeNotFoundException)wrappedExc);
1167+
1168+ } else {
1169+ throw new RuntimeException(wrappedExc.getMessage());
1170+ }
1171+
1172+ } catch (ReflectionException exc3) {
1173+ throw new RuntimeException(exc3.getMessage());
1174+
1175+ } catch (RelationTypeNotFoundException exc4) {
1176+ throw new RuntimeException(exc4.getMessage());
1177+
1178+ } catch (InstanceNotFoundException exc5) {
1179+ throw new RelationServiceNotRegisteredException(exc5.getMessage());
1180+ }
1181+
1182+ Object result = null;
1183+
1184+ if (pbType == 0) {
1185+ // Role can be set
1186+ if (!(initFlg.booleanValue())) {
1187+
1188+ // Not initializing the role
1189+ // If role being initialized:
1190+ // - do not send an update notification
1191+ // - do not try to update internal map of Relation Service
1192+ // listing referenced MBeans, as role is initialized to an
1193+ // empty list
1194+
1195+ // Sends a notification (RelationNotification)
1196+ // Can throw a RelationNotFoundException
1197+ sendRoleUpdateNotification(aRole,
1198+ oldRoleValue,
1199+ relationServCallFlg,
1200+ relationServ);
1201+
1202+ // Updates the role map of the Relation Service
1203+ // Can throw RelationNotFoundException
1204+ updateRelationServiceMap(aRole,
1205+ oldRoleValue,
1206+ relationServCallFlg,
1207+ relationServ);
1208+
1209+ }
1210+
1211+ // Sets the role
1212+ synchronized(myRoleName2ValueMap) {
1213+ myRoleName2ValueMap.put(roleName,
1214+ (Role)(aRole.clone()));
1215+ }
1216+
1217+ // Single role set: returns null: nothing to set in result
1218+
1219+ if (multiRoleFlg) {
1220+ // Multi-roles retrieval: returns the role
1221+ result = aRole;
1222+ }
1223+
1224+ } else {
1225+
1226+ // Role not set
1227+
1228+ if (!(multiRoleFlg)) {
1229+ // Problem when setting a simple role: either role not
1230+ // found, not writable, or incorrect value:
1231+ // raises appropriate exception, RoleNotFoundException or
1232+ // InvalidRoleValueException
1233+ RelationService.throwRoleProblemException(pbType,
1234+ roleName);
1235+ // To keep compiler happy :)
1236+ return null;
1237+
1238+ } else {
1239+ // Problem when retrieving a role in a multi-role retrieval:
1240+ // returns a RoleUnresolved object
1241+ result = new RoleUnresolved(roleName,
1242+ aRole.getRoleValue(),
1243+ pbType);
1244+ }
1245+ }
1246+
1247+ RELATION_LOGGER.exiting(RelationSupport.class.getName(), "setRoleInt");
1248+ return result;
1249+ }
1250+
1251+ // Requires the Relation Service to send a notification
1252+ // RelationNotification, with type being either:
1253+ // - RelationNotification.RELATION_BASIC_UPDATE if the updated relation is
1254+ // a relation internal to the Relation Service
1255+ // - RelationNotification.RELATION_MBEAN_UPDATE if the updated relation is
1256+ // a relation MBean.
1257+ //
1258+ // -param newRole new role
1259+ // -param oldRoleValue old role value (ArrayList of ObjectNames)
1260+ // -param relationServCallFlg true if call from the Relation Service; this
1261+ // will happen if the current RelationSupport object has been created by
1262+ // the Relation Service (via createRelation()) method, so direct access is
1263+ // possible.
1264+ // -param relationServ reference to Relation Service object, if object
1265+ // created by Relation Service.
1266+ //
1267+ // -exception IllegalArgumentException if null parameter provided
1268+ // -exception RelationServiceNotRegisteredException if the Relation
1269+ // Service is not registered in the MBean Server
1270+ // -exception RelationNotFoundException if:
1271+ // - relation MBean
1272+ // and
1273+ // - it has not been added into the Relation Service
1274+ private void sendRoleUpdateNotification(Role newRole,
1275+ List<ObjectName> oldRoleValue,
1276+ boolean relationServCallFlg,
1277+ RelationService relationServ)
1278+ throws IllegalArgumentException,
1279+ RelationServiceNotRegisteredException,
1280+ RelationNotFoundException {
1281+
1282+ if (newRole == null ||
1283+ oldRoleValue == null ||
1284+ (relationServCallFlg && relationServ == null)) {
1285+ String excMsg = "Invalid parameter.";
1286+ throw new IllegalArgumentException(excMsg);
1287+ }
1288+
1289+ RELATION_LOGGER.entering(RelationSupport.class.getName(),
1290+ "sendRoleUpdateNotification", new Object[] {newRole,
1291+ oldRoleValue, relationServCallFlg, relationServ});
1292+
1293+ if (relationServCallFlg) {
1294+ // Direct call to the Relation Service
1295+ // Shall not throw a RelationNotFoundException for an internal
1296+ // relation
1297+ try {
1298+ relationServ.sendRoleUpdateNotification(myRelId,
1299+ newRole,
1300+ oldRoleValue);
1301+ } catch (RelationNotFoundException exc) {
1302+ throw new RuntimeException(exc.getMessage());
1303+ }
1304+
1305+ } else {
1306+
1307+ Object[] params = new Object[3];
1308+ params[0] = myRelId;
1309+ params[1] = newRole;
1310+ params[2] = oldRoleValue;
1311+ String[] signature = new String[3];
1312+ signature[0] = "java.lang.String";
1313+ signature[1] = "javax.management.relation.Role";
1314+ signature[2] = "java.util.List";
1315+
1316+ // Can throw InstanceNotFoundException if the Relation Service
1317+ // is not registered (to be transformed).
1318+ //
1319+ // Can throw a MBeanException wrapping a
1320+ // RelationNotFoundException (to be raised in any case): wrapped
1321+ // exception to be thrown
1322+ //
1323+ // Shall not throw a ReflectionException
1324+ try {
1325+ myRelServiceMBeanServer.invoke(myRelServiceName,
1326+ "sendRoleUpdateNotification",
1327+ params,
1328+ signature);
1329+ } catch (ReflectionException exc1) {
1330+ throw new RuntimeException(exc1.getMessage());
1331+ } catch (InstanceNotFoundException exc2) {
1332+ throw new RelationServiceNotRegisteredException(
1333+ exc2.getMessage());
1334+ } catch (MBeanException exc3) {
1335+ Exception wrappedExc = exc3.getTargetException();
1336+ if (wrappedExc instanceof RelationNotFoundException) {
1337+ throw ((RelationNotFoundException)wrappedExc);
1338+ } else {
1339+ throw new RuntimeException(wrappedExc.getMessage());
1340+ }
1341+ }
1342+ }
1343+
1344+ RELATION_LOGGER.exiting(RelationSupport.class.getName(),
1345+ "sendRoleUpdateNotification");
1346+ return;
1347+ }
1348+
1349+ // Requires the Relation Service to update its internal map handling
1350+ // MBeans referenced in relations.
1351+ // The Relation Service will also update its recording as a listener to
1352+ // be informed about unregistration of new referenced MBeans, and no longer
1353+ // informed of MBeans no longer referenced.
1354+ //
1355+ // -param newRole new role
1356+ // -param oldRoleValue old role value (ArrayList of ObjectNames)
1357+ // -param relationServCallFlg true if call from the Relation Service; this
1358+ // will happen if the current RelationSupport object has been created by
1359+ // the Relation Service (via createRelation()) method, so direct access is
1360+ // possible.
1361+ // -param relationServ reference to Relation Service object, if object
1362+ // created by Relation Service.
1363+ //
1364+ // -exception IllegalArgumentException if null parameter
1365+ // -exception RelationServiceNotRegisteredException if the Relation
1366+ // Service is not registered in the MBean Server
1367+ // -exception RelationNotFoundException if:
1368+ // - relation MBean
1369+ // and
1370+ // - the relation is not added in the Relation Service
1371+ private void updateRelationServiceMap(Role newRole,
1372+ List<ObjectName> oldRoleValue,
1373+ boolean relationServCallFlg,
1374+ RelationService relationServ)
1375+ throws IllegalArgumentException,
1376+ RelationServiceNotRegisteredException,
1377+ RelationNotFoundException {
1378+
1379+ if (newRole == null ||
1380+ oldRoleValue == null ||
1381+ (relationServCallFlg && relationServ == null)) {
1382+ String excMsg = "Invalid parameter.";
1383+ throw new IllegalArgumentException(excMsg);
1384+ }
1385+
1386+ RELATION_LOGGER.entering(RelationSupport.class.getName(),
1387+ "updateRelationServiceMap", new Object[] {newRole,
1388+ oldRoleValue, relationServCallFlg, relationServ});
1389+
1390+ if (relationServCallFlg) {
1391+ // Direct call to the Relation Service
1392+ // Shall not throw a RelationNotFoundException
1393+ try {
1394+ relationServ.updateRoleMap(myRelId,
1395+ newRole,
1396+ oldRoleValue);
1397+ } catch (RelationNotFoundException exc) {
1398+ throw new RuntimeException(exc.getMessage());
1399+ }
1400+
1401+ } else {
1402+ Object[] params = new Object[3];
1403+ params[0] = myRelId;
1404+ params[1] = newRole;
1405+ params[2] = oldRoleValue;
1406+ String[] signature = new String[3];
1407+ signature[0] = "java.lang.String";
1408+ signature[1] = "javax.management.relation.Role";
1409+ signature[2] = "java.util.List";
1410+ // Can throw InstanceNotFoundException if the Relation Service
1411+ // is not registered (to be transformed).
1412+ // Can throw a MBeanException wrapping a RelationNotFoundException:
1413+ // wrapped exception to be thrown
1414+ //
1415+ // Shall not throw a ReflectionException
1416+ try {
1417+ myRelServiceMBeanServer.invoke(myRelServiceName,
1418+ "updateRoleMap",
1419+ params,
1420+ signature);
1421+ } catch (ReflectionException exc1) {
1422+ throw new RuntimeException(exc1.getMessage());
1423+ } catch (InstanceNotFoundException exc2) {
1424+ throw new
1425+ RelationServiceNotRegisteredException(exc2.getMessage());
1426+ } catch (MBeanException exc3) {
1427+ Exception wrappedExc = exc3.getTargetException();
1428+ if (wrappedExc instanceof RelationNotFoundException) {
1429+ throw ((RelationNotFoundException)wrappedExc);
1430+ } else {
1431+ throw new RuntimeException(wrappedExc.getMessage());
1432+ }
1433+ }
1434+ }
1435+
1436+ RELATION_LOGGER.exiting(RelationSupport.class.getName(),
1437+ "updateRelationServiceMap");
1438+ return;
1439+ }
1440+
1441+ // Sets the given roles
1442+ // For each role:
1443+ // - will check the role according to its corresponding role definition
1444+ // provided in relation's relation type
1445+ // - will send a notification (RelationNotification with type
1446+ // RELATION_BASIC_UPDATE or RELATION_MBEAN_UPDATE, depending if the
1447+ // relation is a MBean or not) for each updated role.
1448+ //
1449+ // This method is called in setRoles() above and in Relation Service
1450+ // setRoles() method.
1451+ //
1452+ // -param list list of roles to be set
1453+ // -param relationServCallFlg true if call from the Relation Service; this
1454+ // will happen if the current RelationSupport object has been created by
1455+ // the Relation Service (via createRelation()) method, so direct access is
1456+ // possible.
1457+ // -param relationServ reference to Relation Service object, if object
1458+ // created by Relation Service.
1459+ //
1460+ // -return a RoleResult object
1461+ //
1462+ // -exception IllegalArgumentException if null parameter
1463+ // -exception RelationServiceNotRegisteredException if the Relation
1464+ // Service is not registered in the MBean Server
1465+ // -exception RelationTypeNotFoundException if:
1466+ // - relation MBean
1467+ // and
1468+ // - unknown relation type
1469+ // -exception RelationNotFoundException if:
1470+ // - relation MBean
1471+ // and
1472+ // - not added in the RS
1473+ RoleResult setRolesInt(RoleList list,
1474+ boolean relationServCallFlg,
1475+ RelationService relationServ)
1476+ throws IllegalArgumentException,
1477+ RelationServiceNotRegisteredException,
1478+ RelationTypeNotFoundException,
1479+ RelationNotFoundException {
1480+
1481+ if (list == null ||
1482+ (relationServCallFlg && relationServ == null)) {
1483+ String excMsg = "Invalid parameter.";
1484+ throw new IllegalArgumentException(excMsg);
1485+ }
1486+
1487+ RELATION_LOGGER.entering(RelationSupport.class.getName(),
1488+ "setRolesInt",
1489+ new Object[] {list, relationServCallFlg, relationServ});
1490+
1491+ RoleList roleList = new RoleList();
1492+ RoleUnresolvedList roleUnresList = new RoleUnresolvedList();
1493+
1494+ for (Role currRole : list.asList()) {
1495+
1496+ Object currResult = null;
1497+ // Can throw:
1498+ // RelationServiceNotRegisteredException,
1499+ // RelationTypeNotFoundException
1500+ //
1501+ // Will not throw, due to parameters, RoleNotFoundException or
1502+ // InvalidRoleValueException, but catch them to keep compiler
1503+ // happy
1504+ try {
1505+ currResult = setRoleInt(currRole,
1506+ relationServCallFlg,
1507+ relationServ,
1508+ true);
1509+ } catch (RoleNotFoundException exc1) {
1510+ // OK : Do not throw a RoleNotFoundException.
1511+ } catch (InvalidRoleValueException exc2) {
1512+ // OK : Do not throw an InvalidRoleValueException.
1513+ }
1514+
1515+ if (currResult instanceof Role) {
1516+ // Can throw IllegalArgumentException if role is null
1517+ // (normally should not happen :(
1518+ try {
1519+ roleList.add((Role)currResult);
1520+ } catch (IllegalArgumentException exc) {
1521+ throw new RuntimeException(exc.getMessage());
1522+ }
1523+
1524+ } else if (currResult instanceof RoleUnresolved) {
1525+ // Can throw IllegalArgumentException if role is null
1526+ // (normally should not happen :(
1527+ try {
1528+ roleUnresList.add((RoleUnresolved)currResult);
1529+ } catch (IllegalArgumentException exc) {
1530+ throw new RuntimeException(exc.getMessage());
1531+ }
1532+ }
1533+ }
1534+
1535+ RoleResult result = new RoleResult(roleList, roleUnresList);
1536+
1537+ RELATION_LOGGER.exiting(RelationSupport.class.getName(), "setRolesInt");
1538+ return result;
1539+ }
1540+
1541+ // Initializes all members
1542+ //
1543+ // -param relationId relation identifier, to identify the relation in the
1544+ // Relation Service.
1545+ // Expected to be unique in the given Relation Service.
1546+ // -param relationServiceName ObjectName of the Relation Service where
1547+ // the relation will be registered.
1548+ // It is required as this is the Relation Service that is aware of the
1549+ // definition of the relation type of given relation, so that will be able
1550+ // to check update operations (set). Direct access via the Relation
1551+ // Service (RelationService.setRole()) do not need this information but
1552+ // as any user relation is a MBean, setRole() is part of its management
1553+ // interface and can be called directly on the user relation MBean. So the
1554+ // user relation MBean must be aware of the Relation Service where it will
1555+ // be added.
1556+ // -param relationTypeName Name of relation type.
1557+ // Expected to have been created in given Relation Service.
1558+ // -param list list of roles (Role objects) to initialized the
1559+ // relation. Can be null.
1560+ // Expected to conform to relation info in associated relation type.
1561+ //
1562+ // -exception InvalidRoleValueException if the same name is used for two
1563+ // roles.
1564+ // -exception IllegalArgumentException if a required value (Relation
1565+ // Service Object Name, etc.) is not provided as parameter.
1566+ private void initMembers(String relationId,
1567+ ObjectName relationServiceName,
1568+ MBeanServer relationServiceMBeanServer,
1569+ String relationTypeName,
1570+ RoleList list)
1571+ throws InvalidRoleValueException,
1572+ IllegalArgumentException {
1573+
1574+ if (relationId == null ||
1575+ relationServiceName == null ||
1576+ relationTypeName == null) {
1577+ String excMsg = "Invalid parameter.";
1578+ throw new IllegalArgumentException(excMsg);
1579+ }
1580+
1581+ RELATION_LOGGER.entering(RelationSupport.class.getName(),
1582+ "initMembers", new Object[] {relationId, relationServiceName,
1583+ relationServiceMBeanServer, relationTypeName, list});
1584+
1585+ myRelId = relationId;
1586+ myRelServiceName = relationServiceName;
1587+ myRelServiceMBeanServer = relationServiceMBeanServer;
1588+ myRelTypeName = relationTypeName;
1589+ // Can throw InvalidRoleValueException
1590+ initRoleMap(list);
1591+
1592+ RELATION_LOGGER.exiting(RelationSupport.class.getName(), "initMembers");
1593+ return;
1594+ }
1595+
1596+ // Initialize the internal role map from given RoleList parameter
1597+ //
1598+ // -param list role list. Can be null.
1599+ // As it is a RoleList object, it cannot include null (rejected).
1600+ //
1601+ // -exception InvalidRoleValueException if the same role name is used for
1602+ // several roles.
1603+ //
1604+ private void initRoleMap(RoleList list)
1605+ throws InvalidRoleValueException {
1606+
1607+ if (list == null) {
1608+ return;
1609+ }
1610+
1611+ RELATION_LOGGER.entering(RelationSupport.class.getName(),
1612+ "initRoleMap", list);
1613+
1614+ synchronized(myRoleName2ValueMap) {
1615+
1616+ for (Role currRole : list.asList()) {
1617+
1618+ // No need to check if role is null, it is not allowed to store
1619+ // a null role in a RoleList :)
1620+ String currRoleName = currRole.getRoleName();
1621+
1622+ if (myRoleName2ValueMap.containsKey(currRoleName)) {
1623+ // Role already provided in current list
1624+ StringBuilder excMsgStrB = new StringBuilder("Role name ");
1625+ excMsgStrB.append(currRoleName);
1626+ excMsgStrB.append(" used for two roles.");
1627+ throw new InvalidRoleValueException(excMsgStrB.toString());
1628+ }
1629+
1630+ myRoleName2ValueMap.put(currRoleName,
1631+ (Role)(currRole.clone()));
1632+ }
1633+ }
1634+
1635+ RELATION_LOGGER.exiting(RelationSupport.class.getName(), "initRoleMap");
1636+ return;
1637+ }
1638+
1639+ // Callback used by the Relation Service when a MBean referenced in a role
1640+ // is unregistered.
1641+ // The Relation Service will call this method to let the relation
1642+ // take action to reflect the impact of such unregistration.
1643+ // Current implementation is to set the role with its current value
1644+ // (list of ObjectNames of referenced MBeans) without the unregistered
1645+ // one.
1646+ //
1647+ // -param objectName ObjectName of unregistered MBean
1648+ // -param roleName name of role where the MBean is referenced
1649+ // -param relationServCallFlg true if call from the Relation Service; this
1650+ // will happen if the current RelationSupport object has been created by
1651+ // the Relation Service (via createRelation()) method, so direct access is
1652+ // possible.
1653+ // -param relationServ reference to Relation Service object, if internal
1654+ // relation
1655+ //
1656+ // -exception IllegalArgumentException if null parameter
1657+ // -exception RoleNotFoundException if:
1658+ // - the role does not exist
1659+ // or
1660+ // - role not writable.
1661+ // -exception InvalidRoleValueException if value provided for:
1662+ // - the number of referenced MBeans in given value is less than
1663+ // expected minimum degree
1664+ // or
1665+ // - the number of referenced MBeans in provided value exceeds expected
1666+ // maximum degree
1667+ // or
1668+ // - one referenced MBean in the value is not an Object of the MBean
1669+ // class expected for that role
1670+ // or
1671+ // - a MBean provided for that role does not exist
1672+ // -exception RelationServiceNotRegisteredException if the Relation
1673+ // Service is not registered in the MBean Server
1674+ // -exception RelationTypeNotFoundException if unknown relation type
1675+ // -exception RelationNotFoundException if current relation has not been
1676+ // added in the RS
1677+ void handleMBeanUnregistrationInt(ObjectName objectName,
1678+ String roleName,
1679+ boolean relationServCallFlg,
1680+ RelationService relationServ)
1681+ throws IllegalArgumentException,
1682+ RoleNotFoundException,
1683+ InvalidRoleValueException,
1684+ RelationServiceNotRegisteredException,
1685+ RelationTypeNotFoundException,
1686+ RelationNotFoundException {
1687+
1688+ if (objectName == null ||
1689+ roleName == null ||
1690+ (relationServCallFlg && relationServ == null)) {
1691+ String excMsg = "Invalid parameter.";
1692+ throw new IllegalArgumentException(excMsg);
1693+ }
1694+
1695+ RELATION_LOGGER.entering(RelationSupport.class.getName(),
1696+ "handleMBeanUnregistrationInt", new Object[] {objectName,
1697+ roleName, relationServCallFlg, relationServ});
1698+
1699+ // Retrieves current role value
1700+ Role role;
1701+ synchronized(myRoleName2ValueMap) {
1702+ role = (myRoleName2ValueMap.get(roleName));
1703+ }
1704+
1705+ if (role == null) {
1706+ StringBuilder excMsgStrB = new StringBuilder();
1707+ String excMsg = "No role with name ";
1708+ excMsgStrB.append(excMsg);
1709+ excMsgStrB.append(roleName);
1710+ throw new RoleNotFoundException(excMsgStrB.toString());
1711+ }
1712+ List<ObjectName> currRoleValue = role.getRoleValue();
1713+
1714+ // Note: no need to test if list not null before cloning, null value
1715+ // not allowed for role value.
1716+ List<ObjectName> newRoleValue = new ArrayList<ObjectName>(currRoleValue);
1717+ newRoleValue.remove(objectName);
1718+ Role newRole = new Role(roleName, newRoleValue);
1719+
1720+ // Can throw InvalidRoleValueException,
1721+ // RelationTypeNotFoundException
1722+ // (RoleNotFoundException already detected)
1723+ Object result =
1724+ setRoleInt(newRole, relationServCallFlg, relationServ, false);
1725+
1726+ RELATION_LOGGER.exiting(RelationSupport.class.getName(),
1727+ "handleMBeanUnregistrationInt");
1728+ return;
1729+ }
1730+
1731+}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t