]>
git.argeo.org Git - gpl/argeo-suite.git/blob - org.argeo.app.api/src/org/argeo/app/api/RankedObject.java
1 package org
.argeo
.app
.api
;
5 import org
.argeo
.api
.cms
.CmsLog
;
8 * A container for an object whose relevance can be ranked. Typically used in an
9 * OSGi context with the service.ranking property.
11 public class RankedObject
<T
> {
12 private final static CmsLog log
= CmsLog
.getLog(RankedObject
.class);
14 private final static String SERVICE_RANKING
= "service.ranking";
15 // private final static String SERVICE_ID = "service.id";
18 private Map
<String
, Object
> properties
;
19 private final int rank
;
21 public RankedObject(T object
, Map
<String
, Object
> properties
) {
22 this(object
, properties
, extractRanking(properties
));
25 public RankedObject(T object
, Map
<String
, Object
> properties
, int rank
) {
28 this.properties
= properties
;
32 private static int extractRanking(Map
<String
, Object
> properties
) {
33 if (properties
== null)
35 if (properties
.containsKey(SERVICE_RANKING
))
36 return (Integer
) properties
.get(SERVICE_RANKING
);
37 // else if (properties.containsKey(SERVICE_ID))
38 // return (Long) properties.get(SERVICE_ID);
47 public Map
<String
, Object
> getProperties() {
51 public int getRank() {
56 public int hashCode() {
57 return object
.hashCode();
61 public boolean equals(Object obj
) {
62 if (!(obj
instanceof RankedObject
))
64 RankedObject
<?
> other
= (RankedObject
<?
>) obj
;
65 return rank
== other
.rank
&& object
.equals(other
.object
);
69 public String
toString() {
70 return object
.getClass().getName() + " with rank " + rank
;
73 public static <K
, T
> boolean hasHigherRank(Map
<K
, RankedObject
<T
>> map
, K key
, Map
<String
, Object
> properties
) {
74 if (!map
.containsKey(key
))
76 RankedObject
<T
> rankedObject
= new RankedObject
<>(null, properties
);
77 RankedObject
<T
> current
= map
.get(key
);
78 return current
.getRank() < rankedObject
.getRank();
82 * @return the {@link RankedObject}, or <code>null</code> if the current one was
85 public static <K
, T
> RankedObject
<T
> putIfHigherRank(Map
<K
, RankedObject
<T
>> map
, K key
, T object
,
86 Map
<String
, Object
> properties
) {
87 RankedObject
<T
> rankedObject
= new RankedObject
<>(object
, properties
);
88 if (!map
.containsKey(key
)) {
89 map
.put(key
, rankedObject
);
90 if (log
.isTraceEnabled())
92 "Added " + key
+ " as " + object
.getClass().getName() + " with rank " + rankedObject
.getRank());
95 RankedObject
<T
> current
= map
.get(key
);
96 if (current
.getRank() < rankedObject
.getRank()) {
97 map
.put(key
, rankedObject
);
98 if (log
.isDebugEnabled())
99 log
.debug("Replaced " + key
+ " by " + object
.getClass().getName() + " with rank "
100 + rankedObject
.getRank());
102 } else if (current
.getRank() == rankedObject
.getRank()) {
103 log
.error("Already " + key
+ " by " + current
.get().getClass().getName() + " with rank "
104 + rankedObject
.getRank() + ", ignoring " + rankedObject
.get().getClass().getName());