You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ri...@apache.org on 2010/01/15 19:57:31 UTC
svn commit: r899755 - in
/felix/sandbox/rickhall/resolver/src/main/java/org/apache/felix/resolver:
CapabilityImpl.java cs/CapabilitySet.java
Author: rickhall
Date: Fri Jan 15 18:57:27 2010
New Revision: 899755
URL: http://svn.apache.org/viewvc?rev=899755&view=rev
Log:
Finish support for multi-valued attributes.
Modified:
felix/sandbox/rickhall/resolver/src/main/java/org/apache/felix/resolver/CapabilityImpl.java
felix/sandbox/rickhall/resolver/src/main/java/org/apache/felix/resolver/cs/CapabilitySet.java
Modified: felix/sandbox/rickhall/resolver/src/main/java/org/apache/felix/resolver/CapabilityImpl.java
URL: http://svn.apache.org/viewvc/felix/sandbox/rickhall/resolver/src/main/java/org/apache/felix/resolver/CapabilityImpl.java?rev=899755&r1=899754&r2=899755&view=diff
==============================================================================
--- felix/sandbox/rickhall/resolver/src/main/java/org/apache/felix/resolver/CapabilityImpl.java (original)
+++ felix/sandbox/rickhall/resolver/src/main/java/org/apache/felix/resolver/CapabilityImpl.java Fri Jan 15 18:57:27 2010
@@ -68,50 +68,53 @@
return this;
}
- public CapabilityImpl with(String attr)
+ public CapabilityImpl with(String attrStr)
{
- int idx = attr.indexOf('=');
- if (idx > 0)
- {
- String n = attr.substring(0, idx);
- String v = attr.substring(idx + 1);
- if (getAttribute(n) == null)
- {
- if (n.equalsIgnoreCase(Constants.VERSION_ATTRIBUTE)
- || n.equalsIgnoreCase(Constants.BUNDLE_VERSION_ATTRIBUTE))
- {
- m_attrs.add(new Attribute(n, Version.parseVersion(v), false));
- }
- else
- {
- m_attrs.add(new Attribute(n, v, false));
- }
- }
- }
+ with(attrStr, false);
return this;
}
- public CapabilityImpl withMandatory(String attr)
+ public CapabilityImpl withMandatory(String attrStr)
{
- int idx = attr.indexOf('=');
+ with(attrStr, true);
+ return this;
+ }
+
+ private void with(String attrStr, boolean mandatory)
+ {
+ int idx = attrStr.indexOf('=');
if (idx > 0)
{
- String n = attr.substring(0, idx);
- String v = attr.substring(idx + 1);
- if (getAttribute(n) == null)
+ String n = attrStr.substring(0, idx);
+ String v = attrStr.substring(idx + 1);
+ Object value = v;
+ if (n.equalsIgnoreCase(Constants.VERSION_ATTRIBUTE)
+ || n.equalsIgnoreCase(Constants.BUNDLE_VERSION_ATTRIBUTE))
{
- if (n.equalsIgnoreCase(Constants.VERSION_ATTRIBUTE)
- || n.equalsIgnoreCase(Constants.BUNDLE_VERSION_ATTRIBUTE))
+ value = Version.parseVersion(v);
+ }
+ Attribute existing = getAttribute(n);
+ if (existing == null)
+ {
+ m_attrs.add(new Attribute(n, value, mandatory));
+ }
+ else
+ {
+ if (existing.getValue() instanceof List)
{
- m_attrs.add(new Attribute(n, Version.parseVersion(v), true));
+ ((List) existing.getValue()).add(value);
}
else
{
- m_attrs.add(new Attribute(n, v, true));
+ m_attrs.remove(existing);
+ Attribute aggregate =
+ new Attribute(existing.getName(), new ArrayList(), mandatory);
+ ((List) aggregate.getValue()).add(existing.getValue());
+ ((List) aggregate.getValue()).add(value);
+ m_attrs.add(aggregate);
}
}
}
- return this;
}
public Directive getDirective(String name)
Modified: felix/sandbox/rickhall/resolver/src/main/java/org/apache/felix/resolver/cs/CapabilitySet.java
URL: http://svn.apache.org/viewvc/felix/sandbox/rickhall/resolver/src/main/java/org/apache/felix/resolver/cs/CapabilitySet.java?rev=899755&r1=899754&r2=899755&view=diff
==============================================================================
--- felix/sandbox/rickhall/resolver/src/main/java/org/apache/felix/resolver/cs/CapabilitySet.java (original)
+++ felix/sandbox/rickhall/resolver/src/main/java/org/apache/felix/resolver/cs/CapabilitySet.java Fri Jan 15 18:57:27 2010
@@ -158,8 +158,7 @@
if (attr != null)
{
Object lhs = attr.getValue();
- Object rhs = coerceType(lhs, (String) sf.getValue());
- if (compare(lhs, rhs, sf.getOperation()))
+ if (compare(lhs, (String) sf.getValue(), sf.getOperation()))
{
matches.add(cap);
}
@@ -215,8 +214,7 @@
if (attr != null)
{
Object lhs = attr.getValue();
- Object rhs = coerceType(lhs, (String) sf.getValue());
- matched = compare(lhs, rhs, sf.getOperation());
+ matched = compare(lhs, (String) sf.getValue(), sf.getOperation());
}
}
@@ -275,12 +273,13 @@
private static final Class[] STRING_CLASS = new Class[] { String.class };
- private static boolean compare(Object lhs, Object rhs, int op)
+ private static boolean compare(Object lhs, String rhsString, int op)
{
// If the type is comparable, then we can just return the
// result immediately.
if (lhs instanceof Comparable)
{
+ Object rhs = coerceType(lhs, rhsString);
switch (op)
{
case SimpleFilter.EQ :
@@ -299,6 +298,7 @@
// Booleans do not implement comparable, so special case them.
else if (lhs instanceof Boolean)
{
+ Object rhs = coerceType(lhs, rhsString);
switch (op)
{
case SimpleFilter.EQ :
@@ -328,7 +328,7 @@
Object[] array = (Object[]) lhs;
for (int i = 0; i < array.length; i++)
{
- if (compare(array[i], rhs, op))
+ if (compare(array[i], rhsString, op))
{
return true;
}
@@ -340,7 +340,7 @@
{
for (Iterator iter = ((Collection) lhs).iterator(); iter.hasNext(); )
{
- if (compare(iter.next(), rhs, op))
+ if (compare(iter.next(), rhsString, op))
{
return true;
}
@@ -349,7 +349,7 @@
// Since we cannot identify the LHS type, then we can only perform
// equality comparison.
- return lhs.equals(rhs);
+ return lhs.equals(coerceType(lhs, rhsString));
}
private static Object coerceType(Object lhs, String rhsString)