Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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>();
        }
Beispiel #4
0
        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++;
            }
        }
Beispiel #5
0
        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);
            }
        }
Beispiel #6
0
        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);
            }
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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);
            }
        }
Beispiel #9
0
        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;
                    }
                }
            }
        }