00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 package org.knopflerfish.framework;
00036
00037 import java.util.*;
00038
00039
00045 class Pkg {
00046
00047 final String pkg;
00048
00049 ArrayList exporters = new ArrayList(1);
00050
00051 ArrayList importers = new ArrayList();
00052
00053 ArrayList providers = new ArrayList(1);
00054
00055
00059 Pkg(String pkg) {
00060 this.pkg = pkg;
00061 }
00062
00063
00069 synchronized void addExporter(ExportPkg ep) {
00070 int i = Math.abs(Util.binarySearch(exporters, epComp, ep) + 1);
00071 exporters.add(i, ep);
00072 ep.attachPkg(this);
00073 }
00074
00075
00082 synchronized boolean removeExporter(ExportPkg p) {
00083 providers.remove(p);
00084 exporters.remove(p);
00085 p.detachPkg();
00086 return true;
00087 }
00088
00089
00095 synchronized void addImporter(ImportPkg ip) {
00096 int i = Math.abs(Util.binarySearch(importers, ipComp, ip) + 1);
00097 importers.add(i, ip);
00098 ip.attachPkg(this);
00099 }
00100
00101
00107 synchronized void removeImporter(ImportPkg ip) {
00108 importers.remove(ip);
00109 ip.detachPkg();
00110 }
00111
00112
00119 synchronized void addProvider(ExportPkg ep) {
00120 int i = Util.binarySearch(providers, epComp, ep);
00121 if (i < 0) {
00122 providers.add(-i - 1, ep);
00123 }
00124 }
00125
00126
00133 synchronized ExportPkg getBestProvider() {
00134 if (!providers.isEmpty()) {
00135 return (ExportPkg)providers.get(0);
00136 }
00137 return null;
00138 }
00139
00140
00146 synchronized boolean isEmpty() {
00147 return exporters.size() == 0 && importers.size() == 0;
00148 }
00149
00150
00151 public String toString() {
00152 return toString(2);
00153 }
00154
00155
00156 public String toString(int level) {
00157 StringBuffer sb = new StringBuffer();
00158 sb.append("Pkg[");
00159
00160 if(level > 0) {
00161 sb.append("pkg=" + pkg);
00162 }
00163 if(level > 1) {
00164 sb.append(", providers=" + providers);
00165 }
00166 if(level > 2) {
00167 sb.append(", exporters=" + exporters);
00168 }
00169 sb.append("]");
00170
00171 return sb.toString();
00172 }
00173
00174
00175 static final Util.Comparator epComp = new Util.Comparator() {
00186 public int compare(Object oa, Object ob) throws ClassCastException {
00187 ExportPkg a = (ExportPkg)oa;
00188 ExportPkg b = (ExportPkg)ob;
00189 int d = a.version.compareTo(b.version);
00190 if (d == 0) {
00191 long ld = b.bpkgs.bundle.id - a.bpkgs.bundle.id;
00192 if (ld < 0)
00193 d = -1;
00194 else if (ld > 0)
00195 d = 1;
00196 }
00197 return d;
00198 }
00199 };
00200
00201 static final Util.Comparator ipComp = new Util.Comparator() {
00212 public int compare(Object oa, Object ob) throws ClassCastException {
00213 ImportPkg a = (ImportPkg)oa;
00214 ImportPkg b = (ImportPkg)ob;
00215 int d = a.packageRange.compareTo(b.packageRange);
00216 if (d == 0) {
00217 long ld = b.bpkgs.bundle.id - a.bpkgs.bundle.id;
00218 if (ld < 0)
00219 d = -1;
00220 else if (ld > 0)
00221 d = 1;
00222 }
00223 return d;
00224 }
00225 };
00226
00227
00228 }