@@ -68,6 +68,7 @@ public class AxisMessage extends AxisDescription {
6868
6969 private volatile Policy effectivePolicy = null ;
7070 private volatile Date lastPolicyCalculatedTime = null ;
71+ private volatile long lastPolicyCalculatedVersion = -1 ;
7172
7273 public String getMessagePartName () {
7374 return messagePartName ;
@@ -237,11 +238,12 @@ public void setWrapped(boolean wrapped) {
237238 }
238239
239240 public Policy getEffectivePolicy () {
240- if (lastPolicyCalculatedTime == null || isPolicyUpdated ()) {
241+ if (isPolicyUpdated ()) {
241242 synchronized (this ) {
242- if (lastPolicyCalculatedTime == null || isPolicyUpdated ()) {
243+ if (isPolicyUpdated ()) {
243244 effectivePolicy = calculateEffectivePolicy ();
244245 lastPolicyCalculatedTime = new Date ();
246+ lastPolicyCalculatedVersion = getMaxPolicyVersion ();
245247 }
246248 }
247249 }
@@ -284,31 +286,33 @@ public Policy calculateEffectivePolicy() {
284286 }
285287
286288 public boolean isPolicyUpdated () {
287- // AxisMessage
288- if (getPolicySubject ().getLastUpdatedTime ().after (
289- lastPolicyCalculatedTime )) {
290- return true ;
291- }
289+ return getMaxPolicyVersion () > lastPolicyCalculatedVersion ;
290+ }
291+
292+ /**
293+ * Returns the maximum policy version across the description hierarchy.
294+ * Uses monotonic counter instead of Date to avoid the millisecond-
295+ * granularity race condition in AXIS2-5904.
296+ */
297+ private long getMaxPolicyVersion () {
298+ long max = getPolicySubject ().getVersion ();
292299 // AxisOperation
293300 AxisOperation axisOperation = (AxisOperation ) parent ;
294- if (axisOperation != null
295- && axisOperation .getPolicySubject ().getLastUpdatedTime ().after (
296- lastPolicyCalculatedTime )) {
297- return true ;
301+ if (axisOperation != null ) {
302+ max = Math .max (max , axisOperation .getPolicySubject ().getVersion ());
298303 }
299304 // AxisService
300305 AxisService axisService = (axisOperation == null ) ? null
301306 : axisOperation .getAxisService ();
302- if (axisService != null
303- && axisService .getPolicySubject ().getLastUpdatedTime ().after (
304- lastPolicyCalculatedTime )) {
305- return true ;
307+ if (axisService != null ) {
308+ max = Math .max (max , axisService .getPolicySubject ().getVersion ());
306309 }
307310 // AxisConfiguration
308311 AxisConfiguration axisConfiguration = (axisService == null ) ? null
309312 : axisService .getAxisConfiguration ();
310- return axisConfiguration != null
311- && axisConfiguration .getPolicySubject ().getLastUpdatedTime ()
312- .after (lastPolicyCalculatedTime );
313+ if (axisConfiguration != null ) {
314+ max = Math .max (max , axisConfiguration .getPolicySubject ().getVersion ());
315+ }
316+ return max ;
313317 }
314318}
0 commit comments