private void advanceConstruction() { //Start IslandGO construction if (sideConstructor.getStatus() == Status.Finished) { GlobalVar.islandNumber = sideConstructor.getOsgiProjectConstructor().getProject().getBundles().Count; sideConstructor.setStatus(Status.Idle); IslandStructureConstructor isConstructor = sideConstructor.getIslandStructureConstructor(); List<CartographicIsland> islandStructures = isConstructor.getIslandStructureList(); islandGOConstructor.Construct(islandStructures, advanceConstruction); } /* if (islandGOConstructor.getStatus() == Status.Finished) { islandGOConstructor.setStatus(Status.Idle); //LayoutTester OsgiProject project = sideConstructor.getOsgiProjectConstructor().getProject(); lt.enableLayoutComputation(project.getDependencyGraph()); } */ if (islandGOConstructor.getStatus() == Status.Finished) { islandGOConstructor.setStatus(Status.Idle); OsgiProject project = sideConstructor.getOsgiProjectConstructor().getProject(); serviceGOConstructor.Construct(project.getServices(), islandGOConstructor.getIslandGOs(), advanceConstruction); } if(serviceGOConstructor.getStatus() == Status.Finished) { serviceGOConstructor.setStatus(Status.Idle); dockGOConstructor.Construct(islandGOConstructor.getIslandGOs(), advanceConstruction); } if (dockGOConstructor.getStatus() == Status.Finished) { dockGOConstructor.setStatus(Status.Idle); hierarchyConstructor.Construct(islandGOConstructor.getIslandGOs(), advanceConstruction); } if(hierarchyConstructor.getStatus() == Status.Finished) { hierarchyConstructor.setStatus(Status.Idle); status = Status.Finished; afterConstructionTasks(); } }
private void ConstructProject() { #region OsgiProject status = Status.Working; Debug.Log("Starting OSGi-Project construction!"); JSONObject tmp = jsonObj.GetField("name"); Assert.IsNotNull(tmp, "Projectname could not be found!"); currentProject = new OsgiProject(tmp.str); #endregion #region Bundle,Fragments,Compilation Units tmp = jsonObj.GetField("bundles"); Assert.IsNotNull(tmp, "Project does not contain any Bundles!"); List <JSONObject> jsonBundleList = tmp.list; List <JSONObject> jsonPackageList = jsonObj.GetField("packages").list; long maxLOC = 0; foreach (JSONObject jsonBundle in jsonBundleList) { string name = jsonBundle.GetField("name").str; string symbName = jsonBundle.GetField("symbolicName").str; Bundle currentBundle = new Bundle(name, symbName, currentProject); //Create Fragments tmp = jsonBundle.GetField("packageFragments"); if (tmp != null) { List <JSONObject> fragList = tmp.list; foreach (JSONObject frag in fragList) { JSONObject jsonPkg = frag.GetField("package"); int pkgIdx = resolvePackageReferenceIdx(jsonPkg); string fragName = jsonPackageList[pkgIdx].GetField("qualifiedName").str; Package currentFragment = new Package(currentBundle, fragName); //Create Compilation Units if (frag.GetField("compilationUnits") != null) { List <JSONObject> jsonCompUnits = frag.GetField("compilationUnits").list; foreach (JSONObject jsonCU in jsonCompUnits) { JSONObject tlt = jsonCU.GetField("topLevelType"); string tempStr = tlt.GetField("eClass").str; tempStr = tempStr.Replace(redundantString_A, ""); type type = JavaParser.getTypeFromString(tempStr); tempStr = tlt.GetField("visibility").str; tempStr = tempStr.Replace(redundantString_A, ""); modifier mod = JavaParser.getModifierFromString(tempStr); long loc = jsonCU.GetField("LOC").i; if (loc > maxLOC) { maxLOC = loc; } CompilationUnit compUnit = new CompilationUnit(tlt.GetField("name").str, type, mod, loc, currentFragment); //TODO: Add support for additional information about a compilation unit(Methods, references to others) currentFragment.addCompilationUnit(compUnit); } } currentBundle.addPackage(currentFragment); } } currentProject.addBundle(currentBundle); } GlobalVar.maximumLOCinProject = maxLOC; #endregion #region Services List <Bundle> bundles = currentProject.getBundles(); tmp = jsonObj.GetField("services"); if (tmp != null) { List <JSONObject> serviceJsonList = tmp.list; foreach (JSONObject jsonService in serviceJsonList) { string serviceName = jsonService.GetField("interfaceName").str; tmp = jsonService.GetField("interface"); CompilationUnit serviceCU = null; if (tmp != null) { Vector3 cuIdx = resolveCompilationUnitRef(tmp); serviceCU = bundles[(int)cuIdx.x].getPackages()[(int)cuIdx.y].getCompilationUnits()[(int)cuIdx.z]; serviceCU.setServiceDeclaration(true); } Service service = new Service(serviceName, serviceCU); currentProject.addService(service); } } #endregion #region Resolve import/export + construct ServiceComponents + build dependency graph int i = 0; BidirectionalGraph <GraphVertex, GraphEdge> dependencyGraph = currentProject.getDependencyGraph(); foreach (JSONObject jsonBundle in jsonBundleList) { //Resolve Exports for Bundle tmp = jsonBundle.GetField("exports"); if (tmp != null) { List <Vector2> exportList = resolvePckgFragmentRefList(tmp.list); foreach (Vector2 indexVec in exportList) { Package resolvedFragment = bundles[(int)indexVec.x].getPackages()[(int)indexVec.y]; resolvedFragment.setExport(true); bundles[i].addExportedPackage(resolvedFragment); } } //Resolve Imports for Bundle tmp = jsonBundle.GetField("imports"); if (tmp != null) { List <Vector2> importList = resolvePckgFragmentRefList(tmp.list); foreach (Vector2 indexVec in importList) { Package resolvedFragment = bundles[(int)indexVec.x].getPackages()[(int)indexVec.y]; // Ignore self Import redundancy if (string.Compare(bundles[i].getName(), resolvedFragment.getBundle().getName()) != 0) { bundles[i].addImportedPackage(resolvedFragment); //Package dependency //Check if Vertices already in Graph List <GraphVertex> allVertices = dependencyGraph.Vertices.ToList(); GraphVertex vert1 = allVertices.Find(v => (string.Equals(v.getName(), bundles[i].getName()))); GraphVertex vert2 = allVertices.Find(v => (string.Equals(v.getName(), bundles[(int)indexVec.x].getName()))); if (vert1 == null) { vert1 = new GraphVertex(bundles[i].getName()); } if (vert2 == null) { vert2 = new GraphVertex(bundles[(int)indexVec.x].getName()); } dependencyGraph.AddVertex(vert1); dependencyGraph.AddVertex(vert2); GraphEdge edge; bool edgePresent = dependencyGraph.TryGetEdge(vert1, vert2, out edge); if (edgePresent && dependencyGraph.AllowParallelEdges) { edge.incrementWeight(1f); } else { edge = new GraphEdge(vert1, vert2); dependencyGraph.AddEdge(edge); } GraphEdge opposingEdge; float bidirectionalEdgeWeight = edge.getWeight(); bool oppEdgePresent = dependencyGraph.TryGetEdge(vert2, vert1, out opposingEdge); if (oppEdgePresent) { bidirectionalEdgeWeight += opposingEdge.getWeight(); } if (bidirectionalEdgeWeight > currentProject.getMaxImportCount()) { currentProject.setMaxImportCount((int)bidirectionalEdgeWeight); } } else { Debug.Log("Spotted import redundancy in: " + bundles[i].getName()); } } } //Construct and resolve ServiceComponents List <Service> serviceList = currentProject.getServices(); tmp = jsonBundle.GetField("components"); if (tmp != null) { foreach (JSONObject jsonComponent in tmp.list) { string scName = jsonComponent.GetField("name").str; Vector3 implIdx = resolveCompilationUnitRef(jsonComponent.GetField("implementation")); CompilationUnit resolvedCu = bundles[(int)implIdx.x].getPackages()[(int)implIdx.y].getCompilationUnits()[(int)implIdx.z]; resolvedCu.setServiceComponentImpl(true); ServiceComponent sc = new ServiceComponent(scName, resolvedCu); tmp = jsonComponent.GetField("providedServices"); if (tmp != null) { List <int> serviceRefs = resolveServiceReferenceIdxList(tmp); foreach (int s in serviceRefs) { sc.addProvidedService(serviceList[s]); serviceList[s].addImplementingComponent(sc); } } tmp = jsonComponent.GetField("referencedServices"); if (tmp != null) { List <int> serviceRefs = resolveServiceReferenceIdxList(tmp); foreach (int s in serviceRefs) { sc.addReferencedService(serviceList[s]); serviceList[s].addReferencingComponent(sc); } } bundles[i].addServiceComponent(sc); } } i++; } #endregion Debug.Log("Max Import-count: " + currentProject.getMaxImportCount()); status = Status.Finished; Debug.Log("Finished OSGi-Project construction!"); cb(); }