private List <Service> ParseServices(OSGiProject osgiProject, JSONObject fieldServices) { if (fieldServices == null) { return(null); } foreach (JSONObject fieldService in fieldServices) { string serviceName = fieldService.GetField("interfaceName").str; JSONObject fieldInterface = fieldService.GetField("interface"); CompilationUnit serviceCompilationUnit = null; if (fieldInterface != null) { Vector3 compilationUnitIndex = _referenceResolver.ResolveCompilationUnitReference(fieldInterface); serviceCompilationUnit = osgiProject.GetCompilationUnit(compilationUnitIndex); serviceCompilationUnit.IsService = true; } Service service = new Service(serviceName, serviceCompilationUnit); osgiProject.Services.Add(service); } return(osgiProject.Services); }
public OSGiProject Parse(JSONObject modelData) { OSGiProject osgiProject = new OSGiProject(modelData.GetField("name").str); _referenceResolver = new ReferenceResolver(modelData.GetField("packages"), modelData.GetField("services")); ParseBundles(osgiProject, modelData.GetField("bundles")); ParseServices(osgiProject, modelData.GetField("services")); ParseDependencies(osgiProject, modelData.GetField("bundles")); // TODO: Refactor? osgiProject.Bundles.Sort((x, y) => x.Packages.Count.CompareTo(y.Packages.Count)); osgiProject.Bundles.Reverse(); foreach (Bundle bundle in osgiProject.Bundles) { foreach (Package package in bundle.Packages) { package.CompilationUnits.Sort((x, y) => x.LinesOfCode.CompareTo(y.LinesOfCode)); package.CompilationUnits.Reverse(); } bundle.Packages.Sort((x, y) => x.CompilationUnitCount.CompareTo(y.CompilationUnitCount)); bundle.Packages.Reverse(); } Debug.Log("Done parsing OSGi project model."); ProjectModelParsed(osgiProject); return(osgiProject); }
public Bundle(OSGiProject project, string name, string symbolicName) { OSGiProject = project; Name = name; SymbolicName = symbolicName; Packages = new List <Package>(); ExportedPackages = new List <Package>(); ImportedPackages = new List <Package>(); ServiceComponents = new List <ServiceComponent>(); }
private void ParseDependencies(OSGiProject osgiProject, JSONObject fieldBundles) { int bundleIndex = 0; foreach (JSONObject fieldBundle in fieldBundles) { ParseExports(osgiProject, fieldBundle.GetField("exports"), bundleIndex); ParseImports(osgiProject, fieldBundle.GetField("imports"), bundleIndex); ParseComponents(osgiProject, fieldBundle.GetField("components"), bundleIndex); bundleIndex++; } }
private void ParseReferencedServices(OSGiProject osgiProject, ServiceComponent serviceComponent, JSONObject fieldReferencedServices) { if (fieldReferencedServices == null) { return; } List <int> serviceReferences = _referenceResolver.ResolveServiceReferenceList(fieldReferencedServices); foreach (int serviceReference in serviceReferences) { serviceComponent.ReferencedServices.Add(osgiProject.Services[serviceReference]); osgiProject.Services[serviceReference].ReferencingComponents.Add(serviceComponent); } }
private void ParseExports(OSGiProject osgiProject, JSONObject fieldExports, int bundleIndex) { if (fieldExports == null) { return; } List <Vector2> exportIndices = _referenceResolver.ResolvePackageFragmentReferenceList(fieldExports.list); foreach (Vector2 index in exportIndices) { Package resolvedFragment = osgiProject.GetPackage(index); resolvedFragment.IsExported = true; osgiProject.Bundles[bundleIndex].ExportedPackages.Add(resolvedFragment); } }
private List <Bundle> ParseBundles(OSGiProject osgiProject, JSONObject fieldBundles) { foreach (JSONObject fieldBundle in fieldBundles.list) { string fieldBundleName = fieldBundle.GetField("name").str; string fieldBundleSymbolicName = fieldBundle.GetField("symbolicName").str; Bundle bundle = new Bundle(osgiProject, fieldBundleName, fieldBundleSymbolicName); JSONObject fieldPackageFragments = fieldBundle.GetField("packageFragments"); if (fieldPackageFragments != null) { ParsePackageFragments(bundle, fieldPackageFragments); } osgiProject.Bundles.Add(bundle); } return(osgiProject.Bundles); }
private void ParseComponents(OSGiProject osgiProject, JSONObject fieldComponents, int bundleIndex) { if (fieldComponents == null) { return; } foreach (JSONObject fieldComponent in fieldComponents.list) { Vector3 implIndex = _referenceResolver. ResolveCompilationUnitReference(fieldComponent.GetField("implementation")); CompilationUnit resolvedCompilationUnit = osgiProject.GetCompilationUnit(implIndex); resolvedCompilationUnit.IsServiceComponent = true; ServiceComponent serviceComponent = new ServiceComponent(fieldComponent.GetField("name").str, resolvedCompilationUnit); ParseProvidedServices(osgiProject, serviceComponent, fieldComponent.GetField("providedServices")); ParseReferencedServices(osgiProject, serviceComponent, fieldComponent.GetField("referencedServices")); osgiProject.Bundles[bundleIndex].ServiceComponents.Add(serviceComponent); } }
private void ParseImports(OSGiProject osgiProject, JSONObject fieldImports, int bundleIndex) { if (fieldImports == null) { return; } List <Vector2> importIndices = _referenceResolver.ResolvePackageFragmentReferenceList(fieldImports.list); foreach (Vector2 index in importIndices) { Package resolvedFragment = osgiProject.GetPackage(index); if (string.Compare(osgiProject.Bundles[bundleIndex].Name, resolvedFragment.Bundle.Name) != 0) { osgiProject.Bundles[bundleIndex].ImportedPackages.Add(resolvedFragment); // TODO: Refactor. List <GraphVertex> allVertices = osgiProject.DependencyGraph.Vertices.ToList(); Bundle sourceBundle = osgiProject.Bundles[bundleIndex]; Bundle targetBundle = osgiProject.Bundles[(int)index.x]; GraphVertex vert1 = allVertices.Find(v => (string.Equals(v.Name, sourceBundle.Name))); GraphVertex vert2 = allVertices.Find(v => (string.Equals(v.Name, targetBundle.Name))); if (vert1 == null) { vert1 = new GraphVertex(sourceBundle.Name); } if (vert2 == null) { vert2 = new GraphVertex(targetBundle.Name); } osgiProject.DependencyGraph.AddVertex(vert1); osgiProject.DependencyGraph.AddVertex(vert2); GraphEdge edge; bool edgePresent = osgiProject.DependencyGraph.TryGetEdge(vert1, vert2, out edge); if (edgePresent && osgiProject.DependencyGraph.AllowParallelEdges) { edge.Weight++; } else { edge = new GraphEdge(vert1, vert2); osgiProject.DependencyGraph.AddEdge(edge); } GraphEdge opposingEdge; float bidirectionalEdgeWeight = edge.Weight; bool oppEdgePresent = osgiProject.DependencyGraph.TryGetEdge(vert2, vert1, out opposingEdge); if (oppEdgePresent) { bidirectionalEdgeWeight += opposingEdge.Weight; } if (bidirectionalEdgeWeight > osgiProject.MaximalImportCount) { osgiProject.MaximalImportCount = (int)bidirectionalEdgeWeight; } if (bidirectionalEdgeWeight > osgiProject.MaximalImportCount) { osgiProject.MaximalImportCount = (int)bidirectionalEdgeWeight; } } } }