def _link_enum_values(self, enum_refs, ecount, progress_monitor): count = 0 progress_monitor.start('Parsing enumeration values', ecount) log = gl.LinkerLog(self, self.enum_value_kind.kind) for scode_reference in enum_refs: (field_name, fqn_container) = self._get_field_name(scode_reference) code_elements = self._get_field_elements(field_name, PREFIX_ENUM_VAL_LINKER, self.enum_value_kind) (code_element, potentials) = self.get_code_element(scode_reference, code_elements, field_name, fqn_container, log) count += gl.save_link(scode_reference, code_element, potentials, self) if not log.custom_filtered: reclassify_java(code_element, scode_reference) progress_monitor.work('Processed enum value', 1) log.close() progress_monitor.done() print('Associated {0} enum values'.format(count))
def _link_fields(self, field_refs, acount, progress_monitor): count = 0 progress_monitor.start('Parsing fields', acount) log = gl.LinkerLog(self, self.field_kind.kind) for scode_reference in field_refs: (field_name, fqn_container) = self._get_field_name(scode_reference) code_elements = [] code_elements.extend( self._get_field_elements(field_name, PREFIX_FIELD_LINKER, self.field_kind)) code_elements.extend( self._get_field_elements(field_name, PREFIX_ENUM_VAL_LINKER, self.enum_value_kind)) code_elements.extend( self._get_field_elements(field_name, PREFIX_ANN_FIELD_LINKER, self.ann_field_kind)) (code_element, potentials) = self.get_code_element(scode_reference, code_elements, field_name, fqn_container, log) count += gl.save_link(scode_reference, code_element, potentials, self) if not log.custom_filtered: reclassify_java(code_element, scode_reference) progress_monitor.work('Processed field', 1) log.close() progress_monitor.done() print('Associated {0} fields'.format(count))
def _link_methods(self, method_refs, mcount, progress_monitor): count = 0 progress_monitor.start('Parsing methods', mcount) log = gl.LinkerLog(self, self.method_kind.kind) for scode_reference in method_refs: method_info = self._get_method_info(scode_reference) code_elements = self._get_method_elements(method_info) (code_element, potentials) = self.get_code_element(scode_reference, code_elements, method_info, log) count += gl.save_link(scode_reference, code_element, potentials, self) if not log.custom_filtered: reclassify_java(code_element, scode_reference) progress_monitor.work('Processed method', 1) log.close() progress_monitor.done() print('Associated {0} methods'.format(count))
def _link_enumerations(self, enum_refs, ecount, progress_monitor): count = 0 progress_monitor.start('Parsing enumerations', ecount) log = gl.LinkerLog(self, self.enum_kind.kind) for scode_reference in enum_refs: if scode_reference.declaration: progress_monitor.work('Skipped declaration', 1) continue (simple, fqn) = je.get_annotation_name(scode_reference.content, scode_reference.snippet is not None) if simple is not None: prefix = '{0}{1}{2}'.format(PREFIX_ENUMERATION_LINKER, EXACT, cu.get_codebase_key(self.codebase)) code_elements = cu.get_value( prefix, simple, gl.get_type_code_elements, [simple, self.codebase, self.enum_kind]) (code_element, potentials) = self.get_code_element(scode_reference, code_elements, simple, fqn, log) count += gl.save_link(scode_reference, code_element, potentials, self) if not log.custom_filtered: reclassify_java(code_element, scode_reference) progress_monitor.work('Processed enumeration', 1) log.close() progress_monitor.done() print('Associated {0} enumerations'.format(count))
def link_references(self, progress_monitor=NullProgressMonitor(), local_object_id=None): # Get link to filter. linksets = ReleaseLinkSet.objects\ .filter(project_release=self.prelease)\ .filter(first_link__code_element__kind__is_type=True) count = linksets.count() progress_monitor.start('Post-Processing Classes', count) log = gl.LinkerLog(self, 'type') for linkset in queryset_iterator(linksets): log.reset_variables() scode_reference = linkset.code_reference lcount = linkset.links.count() if lcount <= 1: log.log_type('', '', scode_reference, linkset.first_link.code_element, [linkset.first_link], lcount, 'onlyone') progress_monitor.work('Skipped a linkset.', 1) continue local_ctx_id = scode_reference.local_object_id source = scode_reference.source prefix = '{0}{1}{2}'.format(PREFIX_CLASS_POST_LINKER, cu.get_codebase_key(self.codebase), source) package_freq = cu.get_value(prefix, local_ctx_id, get_package_freq, [local_ctx_id, source, self.prelease]) # Find package with highest frequency code_element = self._find_package_by_freq(linkset, package_freq) rationale = 'highest_frequency' # Heuristic if code_element is None: code_element = self._find_package_by_depth(linkset) rationale = 'heuristic_depth' # Update links if code_element is not None: linkset.first_link.code_element = code_element linkset.first_link.linker_name = self.name linkset.first_link.rationale = rationale linkset.first_link.save() for link in linkset.links.all()[1:]: link.delete() log.log_type('', '', scode_reference, linkset.first_link.code_element, [linkset.first_link], lcount, rationale) progress_monitor.info( 'FOUND Best Package {0} because {1}'.format( code_element.fqn, rationale)) else: potentials =\ [link.code_element for link in linkset.links.all()] log.log_type('', '', scode_reference, linkset.first_link.code_element, potentials, lcount, 'nomatch') progress_monitor.work('Processed a linkset.', 1) progress_monitor.done()
def _link_classes(self, class_refs, ccount, progress_monitor): count = 0 progress_monitor.start('Parsing classes', ccount) log = gl.LinkerLog(self, self.class_kind.kind) for scode_reference in class_refs: if scode_reference.declaration: progress_monitor.work('Skipped declaration', 1) continue (simple, fqn) = je.get_annotation_name(scode_reference.content, scode_reference.snippet is not None) case_insensitive = scode_reference.snippet == None and\ self.source != 'd' if case_insensitive: exact = False exact_prefix = IEXACT else: exact = True exact_prefix = EXACT if simple is not None: prefix = '{0}{1}{2}'.format(PREFIX_CLASS_LINKER, exact_prefix, cu.get_codebase_key(self.codebase)) code_elements = [] code_elements.extend( cu.get_value( prefix, simple, gl.get_type_code_elements, [simple, self.codebase, self.class_kind, exact])) prefix = '{0}{1}{2}'.format(PREFIX_ANNOTATION_LINKER, exact_prefix, cu.get_codebase_key(self.codebase)) code_elements.extend( cu.get_value( prefix, simple, gl.get_type_code_elements, [simple, self.codebase, self.ann_kind, exact])) prefix = '{0}{1}{2}'.format(PREFIX_ENUMERATION_LINKER, exact_prefix, cu.get_codebase_key(self.codebase)) code_elements.extend( cu.get_value( prefix, simple, gl.get_type_code_elements, [simple, self.codebase, self.enum_kind, exact])) (code_element, potentials) = self.get_code_element(scode_reference, code_elements, simple, fqn, log, not exact) count += gl.save_link(scode_reference, code_element, potentials, self) if not log.custom_filtered: reclassify_java(code_element, scode_reference) progress_monitor.work('Processed class', 1) log.close() progress_monitor.done() print('Associated {0} classes'.format(count))
def _process_tuples(self, class_tuples, progress_monitor): method_tuples = [] field_tuples = [] count = 0 for (reference, simple, fqn, class_elements, method_elements, field_elements) in class_tuples: if len(class_elements) > 0: log = gl.LinkerLog(self, 'generic-' + self.class_kind.kind) (code_element, potentials) = \ self.class_linker.get_code_element(reference, class_elements, simple, fqn, log, True) if code_element is not None: count += gl.save_link(reference, code_element, potentials, self) else: method_tuples.append((reference, simple, fqn, method_elements, field_elements)) log.close() else: method_tuples.append( (reference, simple, fqn, method_elements, field_elements)) for (reference, simple, fqn, method_elements, field_elements) in method_tuples: if len(method_elements) > 0: fqn_container = je.get_package_name(fqn) if fqn_container == simple: fqn_container = None log = gl.LinkerLog(self, 'generic-' + self.method_kind.kind) method_info = MethodInfo(simple, fqn_container, None, None) (code_element, potentials) =\ self.method_linker.get_code_element(reference, method_elements, method_info, log) if code_element is not None: count += gl.save_link(reference, code_element, potentials, self) else: field_tuples.append( (reference, simple, fqn, field_elements)) log.close() else: field_tuples.append((reference, simple, fqn, field_elements)) for (reference, simple, fqn, field_elements) in field_tuples: if len(field_elements) > 0: fqn_container = je.get_package_name(fqn) if fqn_container == simple: fqn_container = None log = gl.LinkerLog(self, 'generic-' + self.field_kind.kind) (code_element, potentials) =\ self.field_linker.get_code_element(reference, field_elements, simple, fqn_container, log) if code_element is not None: count += gl.save_link(reference, code_element, potentials, self) else: field_tuples.append( (reference, simple, fqn, field_elements)) log.close() return count