Switch to side-by-side view

--- a/src/main/java/net/timbusproject/dpes/pi/kbserver/beans/QueryBean.java
+++ b/src/main/java/net/timbusproject/dpes/pi/kbserver/beans/QueryBean.java
@@ -18,7 +18,9 @@
 package net.timbusproject.dpes.pi.kbserver.beans;
 
 import ch.lambdaj.function.convert.Converter;
+
 import com.hp.hpl.jena.query.QuerySolution;
+
 import org.apache.commons.lang3.StringUtils;
 import org.sba_research.timbus.kb.FormatMigrationOption;
 import org.sba_research.timbus.kb.PackageKnowledgeBase;
@@ -36,6 +38,7 @@
 import javax.faces.bean.ManagedProperty;
 import javax.faces.bean.SessionScoped;
 import javax.faces.context.FacesContext;
+
 import java.io.Serializable;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -58,7 +61,9 @@
     private static final String tplFormatInfo = "Format: %s\nPronom IDs: %s\n\n";
     private static final String tplToolInfo = "Tool: %s\n\nActions:\n %s\n\nGenres:\n %s\n\n\n";
     private static final String tplToolReplacement = "%s (using %s)\n\nsupports:\n%s\n\ngenres:\n%s\n\n\n";
-    private static final String tplPackageReplacement = "%s (both provide virtual Package(s) %s)\n";
+
+    private static final String tplPackageReplacementBoth = "%s (both provide virtual Package(s) %s)\n";
+    private static final String tplPackageReplacement = "%s (also provides virtual Package(s) %s)\n";
     private static final String tplPackageInfo= "%s provides Package(s) \n%s\n";
     private static final String tplVirtualPackageInfo= "%s provided by Package(s) \n%s\n";
 
@@ -165,28 +170,50 @@
     }
 
     public void packageReplacement() {
-        action = "packageReplacement";
-        List<String> results = filter(equalToIgnoringCase(queryString), packageNames);
-        if (results.size() < 1)
-            notify("Unable to find package: " + queryString);
-        else if (results.size() > 1)
-            notify("Multiple packages found: " + queryString);
-        else {
-            try {
-                String packageName = results.get(0);
-                queryResult = formatPackageAlternatives(packageKnowledgeBase.getAlternativePackages(results.get(0)), packageName);
-            } catch (Exception e) {
-                handleError(e);
-            }
-        }
+	action = "packageReplacement";
+	if (queryString.contains(" provides ")) {
+	    String[] queryParts = queryString.split(" +");
+	    if (queryParts.length==3 && queryParts[1].trim().equalsIgnoreCase("provides")) {
+		String packageName = queryParts[0].trim();
+		String virtualPackageName = queryParts[2].trim();
+		queryResult = formatPackageAlternatives(packageKnowledgeBase.getAlternativePackages(packageName, virtualPackageName));
+//		queryResult = packageKnowledgeBase.getAlternativePackages(packageName, virtualPackageName);
+	    } else {
+		notify("Invalid query '" + queryString + "'; allowed format: <packageName> provides <virtualPackageName>.");
+	    }
+	} else {
+	    List<String> results = filter(equalToIgnoringCase(queryString), packageNames);
+	    if (results.size() < 1)
+		notify("Unable to find package: " + queryString);
+	    else if (results.size() > 1)
+		notify("Multiple packages found: " + queryString);
+	    else {
+		try {
+		    String packageName = results.get(0);
+		    queryResult = formatPackageAlternatives(packageKnowledgeBase.getAlternativePackages(results.get(0)), packageName);
+		} catch (Exception e) {
+		    handleError(e);
+		}
+	    }
+	}
     }
 
     private List<String> formatPackageAlternatives(List<String> alternativePackages, final String replacedPackageName) {
         return convert(alternativePackages, new Converter<String, String>() {
             @Override
             public String convert(String packageName) {
+                return String.format(tplPackageReplacementBoth, removeNamespace(packageName),
+                        join(packageKnowledgeBase.getProvidedVirtualPackages(removeNamespace(packageName), replacedPackageName), " | "));
+            }
+        });
+    }
+
+    private List<String> formatPackageAlternatives(List<String> alternativePackages) {
+        return convert(alternativePackages, new Converter<String, String>() {
+            @Override
+            public String convert(String packageName) {
                 return String.format(tplPackageReplacement, removeNamespace(packageName),
-                        join(packageKnowledgeBase.getProvidedVirtualPackages(removeNamespace(packageName), replacedPackageName), " | "));
+                        join(packageKnowledgeBase.getProvidedVirtualPackages(removeNamespace(packageName)), " | "));
             }
         });
     }