func()

in pkg/util/source/inspector_xml.go [38:130]


func (i XMLInspector) Extract(source v1.SourceSpec, meta *Metadata) error {
	content := strings.NewReader(source.Content)
	decoder := xml.NewDecoder(content)

	//nolint: nestif
	for {
		// Read tokens from the XML document in a stream.
		t, _ := decoder.Token()
		if t == nil {
			break
		}

		if se, ok := t.(xml.StartElement); ok {
			switch se.Name.Local {
			//nolint: goconst
			case "rest", "restConfiguration":
				meta.ExposesHTTPServices = true
				meta.RequiredCapabilities.Add(v1.CapabilityRest)
			case "openApi":
				if dfDep := i.catalog.GetArtifactByScheme("rest-openapi"); dfDep != nil {
					meta.AddDependency(dfDep.GetDependencyID())
				}
			case "circuitBreaker":
				meta.RequiredCapabilities.Add(v1.CapabilityCircuitBreaker)
			case "json":
				dataFormatID := defaultJSONDataFormat
				for _, a := range se.Attr {
					if a.Name.Local == "library" {
						dataFormatID = strings.ToLower(a.Value)
					}
				}
				if dfDep := i.catalog.GetArtifactByDataFormat(dataFormatID); dfDep != nil {
					meta.AddDependency(dfDep.GetDependencyID())
				}
			case language:
				for _, a := range se.Attr {
					if a.Name.Local == language {
						if dependency, ok := i.catalog.GetLanguageDependency(a.Value); ok {
							meta.AddDependency(dependency)
						}
					}
				}
			case "deadLetterChannel":
				for _, a := range se.Attr {
					if a.Name.Local == "deadLetterUri" {
						_, scheme := i.catalog.DecodeComponent(a.Value)
						if dfDep := i.catalog.GetArtifactByScheme(scheme.ID); dfDep != nil {
							meta.AddDependency(dfDep.GetDependencyID())
						}
						if scheme.ID == kamelet {
							AddKamelet(meta, a.Value)
						}
					}
				}
			case "from", "fromF":
				for _, a := range se.Attr {
					if a.Name.Local == URI {
						meta.FromURIs = append(meta.FromURIs, a.Value)
					}
				}
			case "to", "toD", "toF", "wireTap":
				for _, a := range se.Attr {
					if a.Name.Local == URI {
						meta.ToURIs = append(meta.ToURIs, a.Value)
					}
				}
			case kamelet:
				for _, a := range se.Attr {
					if a.Name.Local == "name" {
						AddKamelet(meta, kamelet+":"+a.Value)
					}
				}
			}

			if dependency, ok := i.catalog.GetLanguageDependency(se.Name.Local); ok {
				meta.AddDependency(dependency)
			}
		}
	}

	if err := i.discoverCapabilities(source, meta); err != nil {
		return err
	}
	if err := i.discoverDependencies(source, meta); err != nil {
		return err
	}
	i.discoverKamelets(meta)

	meta.ExposesHTTPServices = meta.ExposesHTTPServices || i.containsHTTPURIs(meta.FromURIs)
	meta.PassiveEndpoints = i.hasOnlyPassiveEndpoints(meta.FromURIs)

	return nil
}