Skip to content

Commit

Permalink
[reqprov] Made the inner classes public and added a parse method for …
Browse files Browse the repository at this point in the history
…a Requirement
  • Loading branch information
pkriens committed Apr 17, 2014
1 parent cdd93bc commit 9b45839
Showing 1 changed file with 172 additions and 31 deletions.
203 changes: 172 additions & 31 deletions biz.aQute.bndlib/src/aQute/bnd/osgi/resource/FilterParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,22 @@
import java.util.*;
import java.util.regex.*;

import org.osgi.resource.*;

import aQute.bnd.version.*;
import aQute.lib.strings.*;

public class FilterParser {
final Map<String,Expression> cache = new HashMap<String,FilterParser.Expression>();

enum Op {
GREATER, GREATER_OR_EQUAL, LESS, LESS_OR_EQUAL, EQUAL, NOT_EQUAL, RANGE;
GREATER(">"), GREATER_OR_EQUAL(">="), LESS("<"), LESS_OR_EQUAL("<="), EQUAL("=="), NOT_EQUAL("!="), RANGE("..");

private String symbol;

Op(String s) {
this.symbol = s;
}

public Op not() {
switch (this) {
Expand All @@ -32,6 +41,10 @@ public Op not() {
return null;
}
}

public String toString() {
return symbol;
}
}

public static abstract class Expression {
Expand Down Expand Up @@ -82,9 +95,13 @@ public String toString() {
toString(sb);
return sb.toString();
}

public String query() {
return null;
}
}

static class RangeExpression extends SimpleExpression {
public static class RangeExpression extends SimpleExpression {
final SimpleExpression low;
final SimpleExpression high;

Expand Down Expand Up @@ -124,15 +141,23 @@ static Expression make(String key, SimpleExpression low, SimpleExpression high)
}

public void toString(StringBuilder sb) {
sb.append(key).append("=");
if (low != null) {
if (low.op == Op.GREATER)
sb.append("(");
else
sb.append("[");
sb.append(low.value);
if (high == null)
sb.append(low.value);
else {
if (low.op == Op.GREATER)
sb.append("(");
else
sb.append("[");
sb.append(low.value);
}
}
sb.append(",");
if (high != null) {
sb.append(",");
if (low == null) {
sb.append("[0.0.0,");
}
sb.append(high.value);
if (high.op == Op.LESS)
sb.append(")");
Expand Down Expand Up @@ -243,7 +268,7 @@ else if ("osgi.wiring.host".equals(key))
return new HostExpression(value);
else if ("osgi.wiring.package".equals(key))
return new PackageExpression(value);
else if ("osgi.wiring.identity".equals(key))
else if ("osgi.identity".equals(key))
return new IdentityExpression(value);
}
return new SimpleExpression(key, op, value);
Expand All @@ -261,9 +286,15 @@ Expression not() {
public void toString(StringBuilder sb) {
sb.append(key).append(op.toString()).append(value);
}

@Override
public String query() {
return value;
}

}

abstract static class WithRangeExpression extends Expression {
public abstract static class WithRangeExpression extends Expression {
RangeExpression range;

public boolean eval(Map<String,Object> map) {
Expand All @@ -275,12 +306,12 @@ void toString(StringBuilder sb) {
if (range == null)
return;

sb.append(";");
sb.append("; ");
range.toString(sb);
}
}

static class PackageExpression extends WithRangeExpression {
public static class PackageExpression extends WithRangeExpression {
final String packageName;

public PackageExpression(String value) {
Expand All @@ -298,13 +329,20 @@ public boolean eval(Map<String,Object> map) {

@Override
void toString(StringBuilder sb) {
sb.append("[I-P:").append(packageName);
sb.append(packageName);
super.toString(sb);
sb.append("]");
}

public String getPackageName() {
return packageName;
}

public String query() {
return "p:" + packageName;
}
}

static class HostExpression extends WithRangeExpression {
public static class HostExpression extends WithRangeExpression {
final String hostName;

public HostExpression(String value) {
Expand All @@ -322,13 +360,20 @@ public boolean eval(Map<String,Object> map) {

@Override
void toString(StringBuilder sb) {
sb.append("[F-H:").append(hostName);
sb.append(hostName);
super.toString(sb);
sb.append("]");
}

public String getHostName() {
return hostName;
}

public String query() {
return "bsn:" + hostName;
}
}

static class BundleExpression extends WithRangeExpression {
public static class BundleExpression extends WithRangeExpression {
final String bundleName;

public BundleExpression(String value) {
Expand All @@ -346,13 +391,17 @@ public boolean eval(Map<String,Object> map) {

@Override
void toString(StringBuilder sb) {
sb.append("[R-B:").append(bundleName);
sb.append(bundleName);
super.toString(sb);
sb.append("]");
}

public String query() {
return "bsn:" + bundleName;
}

}

static class IdentityExpression extends Expression {
public static class IdentityExpression extends WithRangeExpression {
final String identity;

public IdentityExpression(String value) {
Expand All @@ -370,12 +419,20 @@ public boolean eval(Map<String,Object> map) {

@Override
void toString(StringBuilder sb) {
sb.append("[ID:").append(identity);
sb.append("]");
sb.append(identity);
super.toString(sb);
}

public String getSymbolicName() {
return identity;
}

public String query() {
return "bsn:" + identity;
}
}

static abstract class SubExpression extends Expression {
public static abstract class SubExpression extends Expression {
Expression[] expressions;

void toString(StringBuilder sb) {
Expand All @@ -385,9 +442,33 @@ void toString(StringBuilder sb) {
sb.append(")");
}
}

public Expression[] getExpressions() {
return expressions;
}

@Override
public String query() {
if (expressions == null || expressions.length == 0)
return null;

if (expressions[0] instanceof WithRangeExpression) {
return expressions[0].query();
}

List<String> words = new ArrayList<String>();
for (Expression e : expressions) {
String query = e.query();
if (query != null)
words.add(query);
}

return Strings.join(" ", words);
}

}

static class And extends SubExpression {
public static class And extends SubExpression {
private And(List<Expression> exprs) {
this.expressions = exprs.toArray(new Expression[exprs.size()]);
}
Expand Down Expand Up @@ -458,9 +539,22 @@ else if (se.op == Op.LESS || se.op == Op.LESS_OR_EQUAL)

@Override
public void toString(StringBuilder sb) {
sb.append("&");
super.toString(sb);
if (expressions != null && expressions.length > 0) {
if (expressions[0] instanceof WithRangeExpression) {
sb.append(expressions[0]);

for (int i = 1; i < expressions.length; i++) {
sb.append("; ");
expressions[i].toString(sb);
}

}
} else {
sb.append("&");
super.toString(sb);
}
}

}

static class Or extends SubExpression {
Expand Down Expand Up @@ -496,12 +590,12 @@ static Expression make(List<Expression> exprs) {

@Override
public void toString(StringBuilder sb) {
sb.append("&");
sb.append("|");
super.toString(sb);
}
}

static class Not extends Expression {
public static class Not extends Expression {
Expression expr;

private Not(Expression expr) {
Expand Down Expand Up @@ -538,7 +632,7 @@ public void toString(StringBuilder sb) {
}
}

static class PatternExpression extends SimpleExpression {
public static class PatternExpression extends SimpleExpression {
final Pattern pattern;

public PatternExpression(String key, String value) {
Expand All @@ -557,7 +651,7 @@ protected boolean eval(Object scalar) {

}

static class ApproximateExpression extends SimpleExpression {
public static class ApproximateExpression extends SimpleExpression {
public ApproximateExpression(String key, String value) {
super(key, Op.EQUAL, value);
}
Expand Down Expand Up @@ -650,6 +744,22 @@ public Expression parse(String s) throws IOException {
return parse(rover);
}

public Expression parse(Requirement req) throws IOException {
String f = req.getDirectives().get("filter");
if ( f == null)
return new Expression(){

@Override
public boolean eval(Map<String,Object> map) {
return false;
}

@Override
void toString(StringBuilder sb) {
}};

return parse(f);
}
public Expression parse(Rover rover) throws IOException {
String s = rover.findExpr();
Expression e = cache.get(s);
Expand Down Expand Up @@ -725,4 +835,35 @@ private List<Expression> parseExprs(Rover rover) throws IOException {
return exprs;
}

public static String toString(Requirement r) {
try {
StringBuilder sb = new StringBuilder();
String namespace = r.getNamespace();
if ("osgi.wiring.package".equals(namespace)) {
sb.append("Import-Package");
} else if ("osgi.wiring.bundle".equals(namespace)) {
sb.append("Require-Bundle");
} else if ("osgi.wiring.host".equals(namespace)) {
sb.append("Fragment-Host");
} else if ("osgi.identity".equals(namespace)) {
sb.append("");
} else if ("osgi.content".equals(namespace)) {
sb.append("Content");
} else
sb.append(namespace);

FilterParser fp = new FilterParser();
String filter = r.getDirectives().get("filter");
if (filter == null)
sb.append("<no filter>");
else {
Expression parse = fp.parse(filter);
sb.append(parse);
}
return sb.toString();
}
catch (Exception e) {
return e.toString();
}
}
}

0 comments on commit 9b45839

Please sign in to comment.