Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • eclipsefdn/it/api/eclipsefdn-project-adopters
  • malowe/eclipsefdn-project-adopters
  • rsoika/eclipsefdn-project-adopters
  • zacharysabourin/eclipsefdn-project-adopters
  • sbernard/eclipsefdn-project-adopters
  • hebbers/eclipsefdn-project-adopters
  • gadamsuwr/eclipsefdn-project-adopters
  • tellison/eclipsefdn-project-adopters
  • insafuhrmann/eclipsefdn-project-adopters-insafuhrmann
  • rajkumarthiagarajan/eclipsefdn-project-adopters
  • ekorkan/eclipsefdn-project-adopters
  • jfar/eclipsefdn-project-adopters
  • adriengooris/eclipsefdn-project-adopters
  • vivienjovet/eclipsefdn-project-adopters
14 results
Show changes
Commits on Source (59)
Showing
with 719 additions and 379 deletions
......@@ -18,7 +18,7 @@ The project maintains the following source code repositories
Before your contribution can be accepted by the project team contributors must
electronically sign the Eclipse Contributor Agreement (ECA).
* http://www.eclipse.org/legal/ECA.php
* http://www.eclipse.org/legal/eca/
Commits that are provided by non-committers must have a Signed-off-by field in
the footer indicating that the author is aware of the terms by which the
......
......@@ -9,15 +9,15 @@
<version>0.0.1</version>
<properties>
<compiler-plugin.version>3.11.0</compiler-plugin.version>
<compiler-plugin.version>3.13.0</compiler-plugin.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
<quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
<quarkus.platform.version>3.8.3</quarkus.platform.version>
<surefire-plugin.version>3.1.2</surefire-plugin.version>
<quarkus.platform.version>3.15.3.1</quarkus.platform.version>
<surefire-plugin.version>3.3.1</surefire-plugin.version>
<maven.compiler.parameters>true</maven.compiler.parameters>
<sonar.sources>src/main</sonar.sources>
<sonar.tests>src/test</sonar.tests>
......@@ -25,8 +25,8 @@
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
<sonar.coverage.jacoco.xmlReportPaths>${project.basedir}/target/jacoco-report/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths>
<sonar.junit.reportPath>${project.build.directory}/surefire-reports</sonar.junit.reportPath>
<auto-value.version>1.10.4</auto-value.version>
<eclipse-api-version>1.0.1</eclipse-api-version>
<recordbuilder.version>42</recordbuilder.version>
<eclipse-api-version>1.2.1</eclipse-api-version>
<sonar.host.url>https://sonarcloud.io</sonar.host.url>
<sonar.organization>eclipse-foundation-it</sonar.organization>
<sonar.projectKey>eclipsefdn-project-adopters</sonar.projectKey>
......@@ -78,14 +78,13 @@
<artifactId>quarkus-efservices</artifactId>
<version>${eclipse-api-version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jackson</artifactId>
<artifactId>quarkus-rest-client-reactive</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client</artifactId>
<artifactId>quarkus-rest-client-reactive-jackson</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
......@@ -94,24 +93,14 @@
<artifactId>commons-io</artifactId>
</dependency>
<!--
Annotation preprocessors - reduce all of the boiler plate -->
<dependency>
<groupId>com.google.auto.value</groupId>
<artifactId>auto-value</artifactId>
<version>${auto-value.version}</version>
<groupId>io.soabase.record-builder</groupId>
<artifactId>record-builder-processor</artifactId>
<version>${recordbuilder.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.auto.value</groupId>
<artifactId>auto-value-annotations</artifactId>
<version>${auto-value.version}</version>
</dependency>
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
</dependency>
<!-- Testing dependencies only -->
<dependency>
<groupId>io.quarkus</groupId>
......@@ -147,6 +136,18 @@
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>io.soabase.record-builder</groupId>
<artifactId>record-builder-processor</artifactId>
<version>${recordbuilder.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>${surefire-plugin.version}</version>
......
<?xml version="1.0"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.eclipsefoundation</groupId>
<artifactId>eclipsefdn-project-adopters</artifactId>
<version>0.0.1</version>
<properties>
<compiler-plugin.version>3.13.0</compiler-plugin.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
<quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
<quarkus.platform.version>3.15.3</quarkus.platform.version>
<surefire-plugin.version>3.3.1</surefire-plugin.version>
<maven.compiler.parameters>true</maven.compiler.parameters>
<sonar.sources>src/main</sonar.sources>
<sonar.tests>src/test</sonar.tests>
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
<sonar.coverage.jacoco.xmlReportPaths>${project.basedir}/target/jacoco-report/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths>
<sonar.junit.reportPath>${project.build.directory}/surefire-reports</sonar.junit.reportPath>
<recordbuilder.version>42</recordbuilder.version>
<eclipse-api-version>1.2.0</eclipse-api-version>
<sonar.host.url>https://sonarcloud.io</sonar.host.url>
<sonar.organization>eclipse-foundation-it</sonar.organization>
<sonar.projectKey>eclipsefdn-project-adopters</sonar.projectKey>
<sonar.projectName>Eclipse Project Adopters</sonar.projectName>
</properties>
<repositories>
<repository>
<id>eclipsefdn</id>
<url>https://repo.eclipse.org/content/repositories/eclipsefdn/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>${quarkus.platform.group-id}</groupId>
<artifactId>${quarkus.platform.artifact-id}</artifactId>
<version>${quarkus.platform.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.eclipsefoundation</groupId>
<artifactId>quarkus-core</artifactId>
<version>${eclipse-api-version}</version>
<!-- Can be removed once dependency is removed from base package
https://stackoverflow.com/questions/67510802/logging-in-quarkus-works-in-dev-mode-but-doesnt-output-in-jvm-docker-image -->
<exclusions>
<exclusion>
<groupId>org.jboss.logmanager</groupId>
<artifactId>jboss-logmanager</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.eclipsefoundation</groupId>
<artifactId>quarkus-efservices</artifactId>
<version>${eclipse-api-version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-reactive</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-reactive-jackson</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<!--
Annotation preprocessors - reduce all of the boiler plate -->
<dependency>
<groupId>io.soabase.record-builder</groupId>
<artifactId>record-builder-processor</artifactId>
<version>${recordbuilder.version}</version>
<scope>provided</scope>
</dependency>
<!-- Testing dependencies only -->
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipsefoundation</groupId>
<artifactId>quarkus-test-common</artifactId>
<version>${eclipse-api-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jacoco</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>${quarkus.platform.group-id}</groupId>
<artifactId>quarkus-maven-plugin</artifactId>
<version>${quarkus.platform.version}</version>
<extensions>true</extensions>
<executions>
<execution>
<goals>
<goal>build</goal>
<goal>generate-code</goal>
<goal>generate-code-tests</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>io.soabase.record-builder</groupId>
<artifactId>record-builder-processor</artifactId>
<version>${recordbuilder.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>${surefire-plugin.version}</version>
<configuration>
<systemPropertyVariables>
<java.util.logging.manager>
org.jboss.logmanager.LogManager</java.util.logging.manager>
<maven.home>${maven.home}</maven.home>
</systemPropertyVariables>
<includes>
<include>**/*Test.java</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>native</id>
<properties>
<quarkus.package.type>native</quarkus.package.type>
</properties>
<activation>
<property>
<name>native</name>
</property>
</activation>
</profile>
</profiles>
</project>
\ No newline at end of file
......@@ -65,9 +65,18 @@ components:
$ref: "#/components/schemas/AdoptedProject"
AdoptedProject:
type: object
additionalProperties: false
required:
- adopters
- logo
- name
- project_id
- url
properties:
Adopters:
$ref: "#/components/schemas/Adopter"
adopters:
type: array
items:
$ref: "#/components/schemas/Adopter"
logo:
type: string
description: The URL containing the project logo.
......@@ -86,7 +95,19 @@ components:
$ref: "#/components/schemas/Adopter"
Adopter:
type: object
additionalProperties: false
required:
- projects
- homepage_url
- logo
- logo_white
- name
properties:
projects:
type: array
description: List of projects by their ID that the company adopts within a product
items:
type: string
homepage_url:
type: string
description: The URL containing the adopter's homepage.
......
......@@ -14,49 +14,15 @@ package org.eclipsefoundation.adopters.model;
import java.util.List;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import com.google.auto.value.AutoValue;
import io.soabase.recordbuilder.core.RecordBuilder;
/**
* A project with information about its adopters (read from the file system)
* included with the object.
* A project with information about its adopters (read from the file system) included with the object.
*
* @author Martin Lowe
*
*/
@AutoValue
@JsonDeserialize(builder = AutoValue_AdoptedProject.Builder.class)
public abstract class AdoptedProject {
@RecordBuilder
public record AdoptedProject(String projectId, String name, String url, String logo, List<Adopter> adopters) {
public abstract String getProjectId();
public abstract String getName();
public abstract String getUrl();
public abstract String getLogo();
public abstract List<Adopter> getAdopters();
public static Builder builder() {
return new AutoValue_AdoptedProject.Builder();
}
@AutoValue.Builder
@JsonPOJOBuilder(withPrefix = "set")
public abstract static class Builder {
public abstract Builder setProjectId(String id);
public abstract Builder setName(String name);
public abstract Builder setUrl(String url);
public abstract Builder setLogo(String logo);
public abstract Builder setAdopters(List<Adopter> adopters);
public abstract AdoptedProject build();
}
}
......@@ -15,9 +15,8 @@ package org.eclipsefoundation.adopters.model;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import com.google.auto.value.AutoValue;
import io.soabase.recordbuilder.core.RecordBuilder;
/**
* Represents an adopter from the serialized adopter.json file.
......@@ -25,42 +24,8 @@ import com.google.auto.value.AutoValue;
* @author Martin Lowe
*
*/
@AutoValue
@JsonDeserialize(builder = AutoValue_Adopter.Builder.class)
public abstract class Adopter {
public abstract String getName();
@JsonProperty("homepage_url")
public abstract String getHomepageUrl();
public abstract String getLogo();
@JsonProperty("logo_white")
public abstract String getLogoWhite();
public abstract List<String> getProjects();
public static Builder builder() {
return new AutoValue_Adopter.Builder();
}
@AutoValue.Builder
@JsonPOJOBuilder(withPrefix = "set")
public abstract static class Builder {
public abstract Builder setName(String name);
@JsonProperty("homepage_url")
public abstract Builder setHomepageUrl(String url);
public abstract Builder setLogo(String logo);
@JsonProperty("logo_white")
public abstract Builder setLogoWhite(String logoWhite);
public abstract Builder setProjects(List<String> projects);
public abstract Adopter build();
@RecordBuilder
public record Adopter(String name, @JsonProperty("homepage_url") String homepageUrl, String logo,
@JsonProperty("logo_white") String logoWhite, List<String> projects) {
}
}
......@@ -14,31 +14,11 @@ package org.eclipsefoundation.adopters.model;
import java.util.List;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import com.google.auto.value.AutoValue;
/**
* Root object for adopters.json serialized content.
*
* @author Martin Lowe
*
*/
@AutoValue
@JsonDeserialize(builder = AutoValue_AdopterList.Builder.class)
public abstract class AdopterList {
public abstract List<Adopter> getAdopters();
public static Builder builder() {
return new AutoValue_AdopterList.Builder();
}
@AutoValue.Builder
@JsonPOJOBuilder(withPrefix = "set")
public abstract static class Builder {
public abstract Builder setAdopters(List<Adopter> adopters);
public abstract AdopterList build();
}
public record AdopterList(List<Adopter> adopters) {
}
......@@ -21,7 +21,7 @@ import org.apache.commons.lang3.StringUtils;
import org.eclipsefoundation.adopters.model.AdoptedProject;
import org.eclipsefoundation.adopters.model.Breadcrumb;
import org.eclipsefoundation.adopters.service.AdopterService;
import org.eclipsefoundation.caching.model.ParameterizedCacheKey;
import org.eclipsefoundation.caching.model.ParameterizedCacheKeyBuilder;
import org.eclipsefoundation.caching.service.CachingService;
import org.eclipsefoundation.caching.service.LoadingCacheManager;
import org.eclipsefoundation.efservices.api.models.InterestGroup;
......@@ -29,7 +29,9 @@ import org.eclipsefoundation.efservices.api.models.Project;
import org.eclipsefoundation.efservices.api.models.WorkingGroup;
import org.eclipsefoundation.efservices.services.ProjectService;
import org.eclipsefoundation.efservices.services.WorkingGroupService;
import org.eclipsefoundation.http.namespace.CacheControlCommonValues;
import org.eclipsefoundation.utils.helper.TransformationHelper;
import org.jboss.resteasy.reactive.Cache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -85,15 +87,16 @@ public class AdoptersResource {
@GET
@Produces(MediaType.TEXT_HTML)
@Cache(maxAge = CacheControlCommonValues.AGGRESSIVE_CACHE_MAX_AGE)
public Response getHomePage() {
// Sort all Wgs alphabetically
List<WorkingGroup> workingGroups = wgs.get();
workingGroups.sort(Comparator.comparing(WorkingGroup::getTitle));
workingGroups.sort(Comparator.comparing(WorkingGroup::title));
return Response
.ok(cache
.get("homepage-html", null, String.class,
() -> homeTemplate.data("workingGroups", workingGroups).data(BREADCRUMB_TEMPLATE_PROPERTY, null).render())
.getData()
.data()
.orElseGet(errorTemplate::render))
.build();
}
......@@ -101,6 +104,7 @@ public class AdoptersResource {
@GET
@Produces(MediaType.TEXT_HTML)
@Path("how-to-be-listed-as-an-adopter")
@Cache(maxAge = CacheControlCommonValues.AGGRESSIVE_CACHE_MAX_AGE)
public Response getListedPage() {
return Response
.ok(cache
......@@ -110,7 +114,7 @@ public class AdoptersResource {
new Breadcrumb("/adopters/how-to-be-listed-as-an-adopter",
"How to be listed as an Adopter"))
.render())
.getData()
.data()
.orElseGet(errorTemplate::render))
.build();
}
......@@ -118,13 +122,14 @@ public class AdoptersResource {
@GET
@Produces(MediaType.TEXT_HTML)
@Path("project-adopters/{alias}")
@Cache(maxAge = CacheControlCommonValues.AGGRESSIVE_CACHE_MAX_AGE)
public Response getWorkingGroupSubPage(@PathParam("alias") String workingGroupAlias) {
// retrieve the corresponding working group, or return an error
Optional<WorkingGroup> currentWg = wgs.getByName(workingGroupAlias);
if (currentWg.isEmpty()) {
// a bit redundant, but attempt to get a cached error page or render a fresh copy
return Response
.ok(cache.get(workingGroupAlias, null, String.class, errorTemplate::render).getData().orElseGet(errorTemplate::render))
.ok(cache.get(workingGroupAlias, null, String.class, errorTemplate::render).data().orElseGet(errorTemplate::render))
.build();
}
// using the discovered working group, render the working group adopters page, w/ fallback on error page
......@@ -133,50 +138,51 @@ public class AdoptersResource {
.get(workingGroupAlias, null, String.class, () -> adoptersWgTemplate
.data("wg", currentWg.get())
.data(BREADCRUMB_TEMPLATE_PROPERTY,
new Breadcrumb("/adopters/project-adopters/" + workingGroupAlias, currentWg.get().getTitle()))
new Breadcrumb("/adopters/project-adopters/" + workingGroupAlias, currentWg.get().title()))
.render())
.getData()
.data()
.orElseGet(errorTemplate::render))
.build();
}
@GET
@Path("/projects")
@Cache(maxAge = CacheControlCommonValues.AGGRESSIVE_CACHE_MAX_AGE)
public Response getAllAdopters(@QueryParam("working_group") String workingGroup, @QueryParam("interest_group") String interestGroup) {
// get cached project list
List<Project> projects = projectService.getAllProjects();
if (StringUtils.isNotBlank(workingGroup)) {
// check that the passed WG is a valid WG before filtering
List<WorkingGroup> groups = lcm.getList(ParameterizedCacheKey.builder().setId("all").setClazz(WorkingGroup.class).build());
List<WorkingGroup> groups = lcm.getList(ParameterizedCacheKeyBuilder.builder().id("all").clazz(WorkingGroup.class).build());
if (LOGGER.isDebugEnabled()) {
LOGGER
.debug("Groups: {}, looking for {} ({})", groups, TransformationHelper.formatLog(workingGroup),
groups.stream().noneMatch(wg -> wg.getAlias().equals(workingGroup)));
groups.stream().noneMatch(wg -> wg.alias().equals(workingGroup)));
}
if (groups.stream().noneMatch(wg -> wg.getAlias().equals(workingGroup))) {
if (groups.stream().noneMatch(wg -> wg.alias().equals(workingGroup))) {
throw new BadRequestException("Passed working group is not a valid working group");
}
// filter the projects by the passed working group
projects = projects
.stream()
.filter(p -> p.getIndustryCollaborations().stream().anyMatch(wg -> wg.getId().equals(workingGroup)))
.filter(p -> p.industryCollaborations().stream().anyMatch(wg -> wg.id().equals(workingGroup)))
.toList();
}
if (StringUtils.isNotBlank(interestGroup)) {
// check that the passed IG is a valid IG before filtering
List<InterestGroup> groups = lcm.getList(ParameterizedCacheKey.builder().setId("all").setClazz(InterestGroup.class).build());
List<InterestGroup> groups = lcm.getList(ParameterizedCacheKeyBuilder.builder().id("all").clazz(InterestGroup.class).build());
if (LOGGER.isDebugEnabled()) {
LOGGER
.debug("Groups: {}, looking for {} ({})", groups, TransformationHelper.formatLog(interestGroup),
groups.stream().noneMatch(ig -> ig.getShortProjectId().equals(interestGroup)));
groups.stream().noneMatch(ig -> ig.shortProjectId().equals(interestGroup)));
}
if (groups.stream().noneMatch(wg -> wg.getShortProjectId().equals(interestGroup))) {
if (groups.stream().noneMatch(wg -> wg.shortProjectId().equals(interestGroup))) {
throw new BadRequestException("Passed interest group is not a valid interest group");
}
// filter the projects by the passed working group
projects = projects
.stream()
.filter(p -> p.getIndustryCollaborations().stream().anyMatch(wg -> wg.getId().equals(interestGroup)))
.filter(p -> p.industryCollaborations().stream().anyMatch(wg -> wg.id().equals(interestGroup)))
.toList();
}
......@@ -194,10 +200,11 @@ public class AdoptersResource {
@GET
@Path("/projects/{projectId}")
@Cache(maxAge = CacheControlCommonValues.AGGRESSIVE_CACHE_MAX_AGE)
public Response getAdoptersForProject(@PathParam("projectId") String projectId) {
// get cached project list
List<Project> projects = projectService.getAllProjects();
List<Project> filteredProjects = projects.stream().filter(p -> p.getProjectId().equals(projectId)).toList();
List<Project> filteredProjects = projects.stream().filter(p -> p.projectId().equals(projectId)).toList();
// no projects for working group
if (filteredProjects.isEmpty()) {
return Response.ok(Collections.emptyList()).build();
......
......@@ -20,6 +20,7 @@ import java.util.List;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.eclipsefoundation.adopters.model.AdoptedProject;
import org.eclipsefoundation.adopters.model.AdoptedProjectBuilder;
import org.eclipsefoundation.adopters.model.Adopter;
import org.eclipsefoundation.adopters.model.AdopterList;
import org.eclipsefoundation.adopters.service.AdopterService;
......@@ -58,7 +59,7 @@ public class DefaultAdopterService implements AdopterService {
// Attempt to load file on startup. Failing if there is an issue
try (InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(adoptersFilepath)) {
AdopterList adopterList = objectMapper.readValue(is, AdopterList.class);
this.adopters = new ArrayList<>(adopterList.getAdopters());
this.adopters = new ArrayList<>(adopterList.adopters());
LOGGER.info("Initialized {} adopters", adopters.size());
}
}
......@@ -72,7 +73,7 @@ public class DefaultAdopterService implements AdopterService {
@Override
public List<AdoptedProject> getAdoptedProjects(List<Project> projects) {
// For each project, we create an AdoptedProject entity with all relevant adopters
return projects.stream().map(this::getAdoptedProject).filter(a -> !a.getAdopters().isEmpty()).toList();
return projects.stream().map(this::getAdoptedProject).filter(a -> !a.adopters().isEmpty()).toList();
}
/**
......@@ -82,16 +83,16 @@ public class DefaultAdopterService implements AdopterService {
* @return A constructed AdoptedProject entity with all relevant information.
*/
private AdoptedProject getAdoptedProject(Project p) {
return AdoptedProject
return AdoptedProjectBuilder
.builder()
.setProjectId(p.getProjectId())
.setName(p.getName())
.setLogo(p.getLogo())
.setUrl(p.getUrl())
.setAdopters(getAdopters()
.projectId(p.projectId())
.name(p.name())
.logo(p.logo())
.url(p.url())
.adopters(getAdopters()
.stream()
.filter(a -> a.getProjects().contains(p.getProjectId()))
.sorted(Comparator.comparing(a -> a.getName().toLowerCase()))
.filter(a -> a.projects().contains(p.projectId()))
.sorted(Comparator.comparing(a -> a.name().toLowerCase()))
.toList())
.build();
}
......
......@@ -39,9 +39,11 @@ spec:
limits:
cpu: 300m
memory: 384Mi
ephemeral-storage: "100Mi"
requests:
cpu: 300m
memory: 384Mi
ephemeral-storage: "100Mi"
startupProbe:
httpGet:
path: /adopters/q/health
......
......@@ -28,6 +28,7 @@ spec:
values:
- fast
weight: 1
automountServiceAccountToken: false
containers:
- name: app
image: eclipsefdn/eclipsefdn-project-adopters:latest-staging
......@@ -38,9 +39,11 @@ spec:
limits:
cpu: 300m
memory: 384Mi
ephemeral-storage: "100Mi"
requests:
cpu: 300m
memory: 384Mi
ephemeral-storage: "100Mi"
startupProbe:
httpGet:
path: /adopters/q/health
......
......@@ -49,6 +49,15 @@
"iot.zenoh"
]
},
{
"name": "AiP Safe",
"homepage_url": "https://www.aipsafe.cz/",
"logo": "logo-aipsafe.png",
"logo_white": "logo-aipsafe-white.png",
"projects": [
"adoptium.temurin"
]
},
{
"name": "Alias Robotics",
"homepage_url": "https://aliasrobotics.com/",
......@@ -108,15 +117,24 @@
"technology.iceoryx"
]
},
{
"name": "Arburg",
"homepage_url": "https://www.arburg.com/en/",
"logo": "logo-arburg.png",
"logo_white": "logo-arburg-white.png",
"projects": [
"iot.streamsheets"
]
},
{
"name": "Arburg",
"homepage_url": "https://www.arburg.com/en/",
"logo": "logo-arburg.png",
"logo_white": "logo-arburg-white.png",
"projects": [
"iot.streamsheets"
]
},
{
"name": "Archeion",
"homepage_url": "https://archeion.tech/",
"logo": "logo-archeion.svg",
"logo_white": "logo-archeion-white.svg",
"projects": [
"iot.thingweb"
]
},
{
"name": "Arduino",
"homepage_url": "https://www.arduino.cc/en/software#future-version-of-the-arduino-ide",
......@@ -173,6 +191,15 @@
"ecd.glsp"
]
},
{
"name": "Avantronics",
"homepage_url": "https://avantronics.com.mx/",
"logo": "logo-avantronics.png",
"logo_white": "logo-avantronics-white.png",
"projects": [
"iot.keyple"
]
},
{
"name": "beyonnex.io",
"homepage_url": "https://beyonnex.io",
......@@ -182,6 +209,15 @@
"iot.ditto"
]
},
{
"name": "Billettique Services",
"homepage_url": "https://billettiqueservices.com/",
"logo": "logo-billettique-services.png",
"logo_white": "logo-billetique-services-white.png",
"projects": [
"iot.keyple"
]
},
{
"name": "Binero Group",
"homepage_url": "https://binero.com/en",
......@@ -392,6 +428,15 @@
"iot.keyple"
]
},
{
"name": "Cumulocity IoT by Software AG",
"homepage_url": "https://www.softwareag.cloud/site/product/cumulocity-iot.html",
"logo": "logo-cumulocity-by-softwareag.svg",
"logo_white": "logo-cumulocity-by-softwareag-white.svg",
"projects": [
"iot.leshan"
]
},
{
"name": "Delphix",
"homepage_url": "https://www.delphix.com",
......@@ -575,17 +620,26 @@
"iot.keyple"
]
},
{
"name": "FARobot",
"homepage_url": "https://www.farobottech.com/",
"logo": "logo-farobot.png",
"logo_white": "logo-farobot-white.png",
"projects": [
"iot.cyclonedds",
"technology.iceoryx",
"iot.zenoh"
]
},
{
"name": "FARobot",
"homepage_url": "https://www.farobottech.com/",
"logo": "logo-farobot.png",
"logo_white": "logo-farobot-white.png",
"projects": [
"iot.cyclonedds",
"technology.iceoryx",
"iot.zenoh"
]
},
{
"name": "FAU Chair of Technical Information Systems",
"homepage_url": "https://www.ti.rw.fau.de/",
"logo": "logo-fau.png",
"logo_white": "logo-fau-white.png",
"projects": [
"iot.thingweb"
]
},
{
"name": "Fivecomm",
"homepage_url": "https://fivecomm.eu/",
......@@ -622,15 +676,15 @@
"iot.cyclonedds"
]
},
{
"name": "Futurewei",
"homepage_url": "https://www.futurewei.com/",
"logo": "logo-futurewei.png",
"logo_white": "logo-futurewei-white.png",
"projects": [
"iot.zenoh"
]
},
{
"name": "Futurewei",
"homepage_url": "https://www.futurewei.com/",
"logo": "logo-futurewei.png",
"logo_white": "logo-futurewei-white.png",
"projects": [
"iot.zenoh"
]
},
{
"name": "Foxconn",
"homepage_url": "https://www.foxconn.com/en-us/",
......@@ -925,15 +979,24 @@
"ecd.theia"
]
},
{
"name": "Mapless AI, Inc.",
"homepage_url": "https://mapless.ai",
"logo": "logo-maplessai.svg",
"logo_white": "logo-maplessai-white.svg",
"projects": [
"iot.cyclonedds"
]
},
{
"name": "Mapless AI, Inc.",
"homepage_url": "https://mapless.ai",
"logo": "logo-maplessai.svg",
"logo_white": "logo-maplessai-white.svg",
"projects": [
"iot.cyclonedds"
]
},
{
"name": "MAVERIC Project",
"homepage_url": "https://www.maveric-project.org/",
"logo": "logo-maveric.svg",
"logo_white": "logo-maveric-white.svg",
"projects": [
"iot.thingweb"
]
},
{
"name": "MediaMarktSaturn Technology",
"homepage_url": "https://mms.tech/",
......@@ -952,6 +1015,15 @@
"adoptium.temurin"
]
},
{
"name": "Michelin",
"homepage_url": "https://opensource.michelin.io/",
"logo": "logo-michelin.svg",
"logo_white": "logo-michelin-white.svg",
"projects": [
"adoptium.temurin"
]
},
{
"name": "Microsoft",
"homepage_url": "https://microsoft.com/",
......@@ -959,7 +1031,8 @@
"logo_white": "logo-microsoft-white.svg",
"projects": [
"iot.paho",
"adoptium.temurin"
"adoptium.temurin",
"iot.thingweb"
]
},
{
......@@ -989,6 +1062,15 @@
"adoptium.temurin"
]
},
{
"name": "NEPHELE Project",
"homepage_url": "https://nephele-project.eu/",
"logo": "logo-nephele.svg",
"logo_white": "",
"projects": [
"iot.thingweb"
]
},
{
"name": "New Eagle",
"homepage_url": "https://neweagle.net",
......@@ -1088,6 +1170,15 @@
"iot.leshan"
]
},
{
"name": "ORMAES",
"homepage_url": "https://www.ormaes.fr/",
"logo": "logo-ormaes.svg",
"logo_white": "logo-ormaes-white.svg",
"projects": [
"iot.keyple"
]
},
{
"name": "OSB connagtive GmbH",
"homepage_url": "https://iot-suite.io",
......@@ -1302,6 +1393,15 @@
"iot.cyclonedds"
]
},
{
"name": "Secretaría de Movilidad",
"homepage_url": "https://www.semovi.cdmx.gob.mx",
"logo": "logo-cdmx-semovi.svg",
"logo_white": "logo-cdmx-semovi-white.svg",
"projects": [
"iot.keyple"
]
},
{
"name": "Scentbird",
"homepage_url": "https://www.scentbird.com",
......@@ -1320,6 +1420,15 @@
"iot.cyclonedds"
]
},
{
"name": "Siemens",
"homepage_url": "https://www.siemens.com",
"logo": "logo-siemens.png",
"logo_white": "logo-siemens-white.png",
"projects": [
"iot.thingweb"
]
},
{
"name": "Sierra Wireless",
"homepage_url": "https://www.sierrawireless.com/",
......@@ -1349,15 +1458,6 @@
"iot.keyple"
]
},
{
"name": "Cumulocity IoT by Software AG",
"homepage_url": "https://www.softwareag.cloud/site/product/cumulocity-iot.html",
"logo": "logo-cumulocity-by-softwareag.svg",
"logo_white": "logo-cumulocity-by-softwareag-white.svg",
"projects": [
"iot.leshan"
]
},
{
"name": "Societe Generale",
"homepage_url": "https://www.societegenerale.com/",
......@@ -1403,6 +1503,15 @@
"iot.keyple"
]
},
{
"name": "Starburst",
"homepage_url": "https://starburst.io/",
"logo": "logo-starburst.svg",
"logo_white": "logo-starburst-white.svg",
"projects": [
"adoptium.temurin"
]
},
{
"name": "Steinbeis-Transferzentrum Industrielle Digitalisierung",
"homepage_url": "https://idhorb.de/",
......@@ -1459,15 +1568,33 @@
"iot.ditto"
]
},
{
"name": "Terapines",
"homepage_url": "https://www.terapines.com/",
"logo": "logo-terapines.svg",
"logo_white": "logo-terapines-white.svg",
"projects": [
"ecd.theia"
]
},
{
"name": "Technical University of Munich (TUM)",
"homepage_url": "https://www.tum.de/",
"logo": "logo-tum.png",
"logo_white": "logo-tum-white.png",
"projects": [
"iot.thingweb"
]
},
{
"name": "Terapines",
"homepage_url": "https://www.terapines.com/",
"logo": "logo-terapines.svg",
"logo_white": "logo-terapines-white.svg",
"projects": [
"ecd.theia"
]
},
{
"name": "Texas Instruments",
"homepage_url": "https://www.ti.com/",
"logo": "logo-texas-instruments.png",
"logo_white": "logo-texas-instruments.png",
"projects": [
"ecd.theia"
]
},
{
"name": "The Construct",
"homepage_url": "http://www.theconstruct.ai",
......@@ -1543,6 +1670,15 @@
"iot.cyclonedds"
]
},
{
"name": "Trend Micro",
"homepage_url": "https://www.trendmicro.com/",
"logo": "logo-trend-micro.png",
"logo_white": "",
"projects": [
"adoptium.temurin"
]
},
{
"name": "TypeFox",
"homepage_url": "https://www.typefox.io/",
......@@ -1634,6 +1770,15 @@
"projects": [
"iot.cyclonedds"
]
},
{
"name": "Lonti",
"homepage_url": "https://lonti.com",
"logo": "logo-lonti.png",
"logo_white": "logo-lonti-white.png",
"projects": [
"ecd.theia"
]
}
]
}
......@@ -4,8 +4,8 @@
<ul>
<li><a href="//eclipse.org">Eclipse home</a></li>
<li><a href="//eclipse.org/projects/searchpage.php">Search</a> our site</li>
<li>Website <a href="//eclipse.org/legal/privacy.php">privacy policy</a> and <a href="//eclipse.org/legal/termsofuse.php">terms of use</a></li>
<li><a href="//eclipse.org/legal">Legal documents</a></li>
<li>Website <a href="//eclipse.org/legal/privacy/">privacy policy</a> and <a href="//eclipse.org/legal/terms-of-use/">terms of use</a></li>
<li><a href="//eclipse.org/legal/">Legal documents</a></li>
<li><a href="//eclipse.org/artwork/">Logos</a> and artwork</li>
<li><a href="//wiki.eclipse.org/index.php/Webmaster_FAQ">webmaster FAQ</a></li>
<li><a href="mailto:webmaster@eclipse.org">Email the webmaster</a></li>
......
......@@ -19,14 +19,17 @@ import org.eclipse.microprofile.rest.client.inject.RestClient;
import org.eclipsefoundation.core.service.APIMiddleware.BaseAPIParameters;
import org.eclipsefoundation.efservices.api.WorkingGroupsAPI;
import org.eclipsefoundation.efservices.api.models.WorkingGroup;
import org.eclipsefoundation.efservices.api.models.WorkingGroup.WorkingGroupParticipationAgreement;
import org.eclipsefoundation.efservices.api.models.WorkingGroup.WorkingGroupParticipationAgreements;
import org.eclipsefoundation.efservices.api.models.WorkingGroup.WorkingGroupParticipationLevel;
import org.eclipsefoundation.efservices.api.models.WorkingGroup.WorkingGroupResources;
import org.eclipsefoundation.efservices.api.models.WorkingGroupBuilder;
import org.eclipsefoundation.efservices.api.models.WorkingGroupWorkingGroupParticipationAgreementBuilder;
import org.eclipsefoundation.efservices.api.models.WorkingGroupWorkingGroupParticipationAgreementsBuilder;
import org.eclipsefoundation.efservices.api.models.WorkingGroupWorkingGroupParticipationLevelBuilder;
import org.eclipsefoundation.efservices.api.models.WorkingGroupWorkingGroupResourcesBuilder;
import org.eclipsefoundation.testing.helpers.MockDataPaginationHandler;
import org.jboss.resteasy.reactive.RestResponse;
import io.quarkus.test.Mock;
import io.smallrye.mutiny.Uni;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.ws.rs.core.Response;
@Mock
@RestClient
......@@ -39,51 +42,49 @@ public class MockWorkingGroupAPI implements WorkingGroupsAPI {
this.wgs = new ArrayList<>();
this.wgs
.addAll(Arrays
.asList(WorkingGroup
.asList(WorkingGroupBuilder
.builder()
.setAlias("sample-wg")
.setDescription("")
.setLevels(Arrays
.asList(WorkingGroupParticipationLevel
.alias("sample-wg")
.description("")
.levels(Arrays
.asList(WorkingGroupWorkingGroupParticipationLevelBuilder
.builder()
.setDescription("sample")
.setRelation("WGSAMP")
.description("sample")
.relation("WGSAMP")
.build()))
.setLogo("")
.setParentOrganization("eclipse")
.setResources(WorkingGroupResources
.logo("")
.parentOrganization("eclipse")
.resources(WorkingGroupWorkingGroupResourcesBuilder
.builder()
.setCharter("")
.setContactForm("")
.setMembers("")
.setSponsorship("")
.setWebsite("")
.setParticipationAgreements(WorkingGroupParticipationAgreements
.charter("")
.contactForm("")
.members("")
.sponsorship("")
.website("")
.participationAgreements(WorkingGroupWorkingGroupParticipationAgreementsBuilder
.builder()
.setIndividual(WorkingGroupParticipationAgreement
.individual(WorkingGroupWorkingGroupParticipationAgreementBuilder
.builder()
.setDocumentId("sample-wg-iwgpa")
.setPdf("sample-wg-iwgpa.pdf")
.documentId("sample-wg-iwgpa")
.pdf("sample-wg-iwgpa.pdf")
.build())
.setOrganization(WorkingGroupParticipationAgreement
.organization(WorkingGroupWorkingGroupParticipationAgreementBuilder
.builder()
.setDocumentId("sample-wg-owgpa")
.setPdf("sample-wg-owgpa.pdf")
.documentId("sample-wg-owgpa")
.pdf("sample-wg-owgpa.pdf")
.build())
.build())
.build())
.setStatus("active")
.setTitle("Sample WG")
.status("active")
.title("Sample WG")
.build()));
}
@Override
public Response get(BaseAPIParameters baseParams) {
return Response.ok(wgs).build();
}
@Override
public Response getAllByStatuses(BaseAPIParameters baseParams, List<String> statuses) {
return Response.ok(wgs.stream().filter(wg -> statuses.contains(wg.getStatus())).toList()).build();
public Uni<RestResponse<List<WorkingGroup>>> get(BaseAPIParameters baseParams, List<String> statuses) {
return Uni
.createFrom()
.item(MockDataPaginationHandler
.paginateData(baseParams, wgs.stream().filter(wg -> statuses == null || statuses.contains(wg.status())).toList()));
}
}
static/assets/images/adopters/logo-aipsafe-white.png

37.4 KiB

static/assets/images/adopters/logo-aipsafe.png

37.7 KiB

<?xml version="1.0" encoding="UTF-8"?>
<svg id="Livello_1" data-name="Livello 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.89 252.09">
<defs>
<style>
.cls-1 {
fill: #fff;
}
</style>
</defs>
<g>
<g>
<path class="cls-1" d="m224.9,155.53c0-7.16,2.32-12.69,6.97-16.59,4.65-3.9,11.14-5.85,19.49-5.85h21.9v-5.58c0-10.38-5.49-15.57-16.46-15.57-5.3,0-9.41,1.18-12.31,3.54-2.9,2.36-4.47,5.67-4.69,9.93h-11.83c.31-7.21,3.11-12.86,8.36-16.97,5.26-4.1,12.31-6.15,21.15-6.15,4.58,0,8.71.67,12.38,2.01,3.67,1.34,6.51,3.05,8.5,5.13,2.04,2.18,3.54,4.44,4.49,6.8,1.59,3.67,2.38,7.53,2.38,11.56v39.72h10.75v8.91h-12.45c-3.22,0-5.54-.67-6.97-2.01-1.43-1.34-2.25-3.41-2.48-6.22l-.14-3.74h-.82c-1.59,4.08-4.64,7.32-9.15,9.73s-9.74,3.6-15.68,3.6c-7.26,0-12.97-2.01-17.14-6.02-4.17-4.01-6.26-9.42-6.26-16.22Zm12.38-3.06v4.42c0,3.54,1.24,6.28,3.71,8.23,2.47,1.95,5.84,2.92,10.1,2.92,6.75,0,12.14-2.04,16.15-6.12,4.01-4.08,6.02-9.48,6.02-16.19v-3.88h-20.74c-4.71,0-8.43.98-11.15,2.92-2.72,1.95-4.08,4.51-4.08,7.69Z"/>
<path class="cls-1" d="m320.69,103.7h25.23v10h-24.15v62.71h-12.11v-61.96c0-7.16,3.67-10.75,11.02-10.75Z"/>
<path class="cls-1" d="m403.97,151.58h11.97c-1.18,8.12-4.65,14.51-10.4,19.18-5.76,4.67-13.06,7.01-21.9,7.01-10.84,0-19.3-3.38-25.37-10.13-6.12-6.8-9.18-15.94-9.18-27.41s3.19-21.22,9.59-27.88c6.44-6.71,14.9-10.07,25.37-10.07,8.39,0,15.44,2.28,21.15,6.83s9.16,10.64,10.34,18.26h-11.97c-1.18-4.85-3.54-8.55-7.07-11.09-3.54-2.54-7.87-3.81-12.99-3.81-6.49,0-11.78,2.11-15.88,6.32-4.11,4.22-6.16,9.68-6.16,16.39v11.02c0,6.48,2.02,11.7,6.05,15.64s9.36,5.92,15.98,5.92c5.35,0,9.87-1.46,13.57-4.39,3.7-2.92,6-6.86,6.9-11.8Z"/>
<path class="cls-1" d="m444.34,176.41h-12.11v-102.08h12.11v42.64h.89c2.27-4.53,5.58-8.12,9.93-10.75,4.35-2.63,9.2-3.94,14.55-3.94,7.84,0,14.01,2.63,18.5,7.89,4.49,5.26,6.73,12.4,6.73,21.42v44.82h-11.97v-43.59c0-13.56-5.76-20.33-17.27-20.33-6.39,0-11.55,2.32-15.47,6.97-3.92,4.65-5.88,10.83-5.88,18.53v38.43Z"/>
<path class="cls-1" d="m544.89,102.28c9.98,0,17.85,2.94,23.63,8.81,5.78,5.87,8.67,13.86,8.67,23.97,0,2.72-.14,5.21-.41,7.48h-53.66v4.22c0,6.39,2.02,11.54,6.05,15.44,4.03,3.9,9.4,5.85,16.12,5.85,5.08,0,9.44-1.22,13.09-3.67s6.06-5.74,7.24-9.86h11.97c-1.59,7.16-5.3,12.83-11.15,17-6.03,4.17-13.17,6.26-21.43,6.26-10.56,0-18.92-3.41-25.06-10.24-6.14-6.82-9.21-16.08-9.21-27.78s3.05-20.81,9.15-27.48c6.1-6.66,14.43-10,24.99-10Zm-21.76,29.45v1.9h42.1v-2.79c0-5.62-1.87-10.16-5.61-13.6-3.74-3.45-8.65-5.17-14.73-5.17-6.39,0-11.62,1.81-15.68,5.44-4.06,3.63-6.09,8.37-6.09,14.21Z"/>
<path class="cls-1" d="m606.41,90.17h-11.97v-15.85h11.97v15.85Zm0,86.24h-11.97v-72.7h11.97v72.7Z"/>
<path class="cls-1" d="m623.24,140.02c0-11.7,3.19-20.88,9.59-27.54,6.39-6.8,14.85-10.2,25.37-10.2s18.93,3.36,25.23,10.07c6.39,6.66,9.59,15.89,9.59,27.68s-3.09,20.8-9.25,27.58c-6.17,6.78-14.69,10.17-25.57,10.17s-19.43-3.38-25.64-10.13c-6.21-6.76-9.32-15.96-9.32-27.61Zm12.38-5.24v11.29c0,6.71,2.12,12,6.36,15.88,4.24,3.88,9.65,5.81,16.22,5.81s12.04-1.96,16.25-5.88c4.22-3.92,6.33-9.19,6.33-15.81v-11.29c0-6.66-2.1-12.05-6.29-16.15-4.19-4.1-9.62-6.15-16.29-6.15s-11.95,2.09-16.26,6.26c-4.22,4.08-6.32,9.43-6.32,16.05Z"/>
<path class="cls-1" d="m722.09,176.41h-12.11v-72.7h10.61l1.5,13.53h1.02c2.27-4.67,5.54-8.33,9.82-10.98,4.29-2.65,9.17-3.98,14.66-3.98,7.8,0,13.95,2.65,18.46,7.96,4.51,5.3,6.77,12.47,6.77,21.49v44.68h-12.11v-43.46c0-13.28-5.71-19.93-17.14-19.93-6.39,0-11.57,2.34-15.54,7.01-3.97,4.67-5.95,10.79-5.95,18.36v38.02Z"/>
</g>
<path class="cls-1" d="m791.57,161.87c2.05,0,3.75.66,5.1,1.99,1.37,1.32,2.06,3.02,2.06,5.1s-.69,3.78-2.06,5.1c-1.39,1.34-3.09,2-5.1,2s-3.71-.67-5.07-2c-1.35-1.33-2.03-3.03-2.03-5.1s.68-3.77,2.03-5.1,3.04-1.99,5.07-1.99Zm6.29,7.09c0-1.86-.6-3.38-1.81-4.56-1.2-1.2-2.7-1.81-4.48-1.81s-3.25.6-4.45,1.81c-1.19,1.21-1.78,2.74-1.78,4.59s.59,3.35,1.78,4.51c1.22,1.17,2.71,1.75,4.48,1.75s3.26-.58,4.45-1.75c1.2-1.18,1.81-2.69,1.81-4.53Zm-7.75,3.45h-1.16v-7.01h3.4c.66,0,1.17.18,1.52.53s.53.85.53,1.48c0,.9-.35,1.46-1.05,1.7v.09h.33c.5,0,.75.26.75.78v2.42h-1.13v-2.61h-3.19v2.61Zm0-6.04v2.48h1.98c.33,0,.6-.09.8-.27s.3-.42.3-.73v-.54c0-.28-.09-.51-.28-.68s-.44-.26-.74-.26h-2.06Z"/>
</g>
<g>
<path class="cls-1" d="m164.4,122.2c-3.92,6.81-14.26,24.81-16.66,28.98-.31.54-.88.87-1.51.87h-35.42c-1.34,0-2.18,1.45-1.51,2.61l16.87,29.34c.31.54.89.87,1.51.87h37.44c.62,0,1.2-.33,1.51-.88l17.61-30.71c.31-.54.31-1.2,0-1.73l-16.83-29.35c-.67-1.17-2.35-1.17-3.02,0Z"/>
<path class="cls-1" d="m110.85,132.25l-6.25-10.89c-.67-1.17-2.35-1.17-3.02,0l-17.04,29.72c-.31.54-.89.88-1.51.88h-34.47c-1.34,0-2.18,1.45-1.51,2.61l16.86,29.43c.31.54.89.88,1.51.88h35.82c.62,0,1.2-.33,1.51-.88l8.01-13.97c.31-.54.31-1.2,0-1.74l-9.38-16.31c-.31-.54-.31-1.21,0-1.75l9.47-16.23c.31-.54.32-1.2,0-1.75Z"/>
<path class="cls-1" d="m106.02,113.27l10.48,18.27c.31.54.89.88,1.51.88h14.21c.62,0,1.2-.33,1.51-.88l19.02-33.17c.31-.54.31-1.2,0-1.73l-16.37-28.53c-.67-1.17-2.35-1.17-3.02,0l-16.98,29.62c-.31.54-.89.88-1.51.88h-35.47c-1.34,0-2.18,1.45-1.51,2.61l5.92,10.32c.31.54.89.88,1.51.88h19.19c.62,0,1.2.33,1.51.88Z"/>
<polygon class="cls-1" points="111.11 132.41 111.11 132.41 111.11 132.42 111.11 132.41"/>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Livello_1" data-name="Livello 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.89 252.09">
<defs>
<style>
.cls-1 {
fill: #201a3f;
}
</style>
</defs>
<g>
<g>
<path class="cls-1" d="m239.85,155.53c0-7.16,2.32-12.69,6.97-16.59,4.65-3.9,11.14-5.85,19.49-5.85h21.9v-5.58c0-10.38-5.49-15.57-16.46-15.57-5.3,0-9.41,1.18-12.31,3.54-2.9,2.36-4.47,5.67-4.69,9.93h-11.83c.31-7.21,3.11-12.86,8.36-16.97,5.26-4.1,12.31-6.15,21.15-6.15,4.58,0,8.71.67,12.38,2.01,3.67,1.34,6.51,3.05,8.5,5.13,2.04,2.18,3.54,4.44,4.49,6.8,1.59,3.67,2.38,7.53,2.38,11.56v39.72h10.75v8.91h-12.45c-3.22,0-5.54-.67-6.97-2.01-1.43-1.34-2.25-3.41-2.48-6.22l-.14-3.74h-.82c-1.59,4.08-4.64,7.32-9.15,9.73-4.51,2.4-9.74,3.6-15.68,3.6-7.26,0-12.97-2.01-17.14-6.02-4.17-4.01-6.26-9.42-6.26-16.22Zm12.38-3.06v4.42c0,3.54,1.24,6.28,3.71,8.23,2.47,1.95,5.84,2.92,10.1,2.92,6.75,0,12.14-2.04,16.15-6.12,4.01-4.08,6.02-9.48,6.02-16.19v-3.88h-20.74c-4.71,0-8.43.98-11.15,2.92-2.72,1.95-4.08,4.51-4.08,7.69Z"/>
<path class="cls-1" d="m335.64,103.7h25.23v10h-24.15v62.71h-12.11v-61.96c0-7.16,3.67-10.75,11.02-10.75Z"/>
<path class="cls-1" d="m418.92,151.58h11.97c-1.18,8.12-4.65,14.51-10.4,19.18-5.76,4.67-13.06,7.01-21.9,7.01-10.84,0-19.3-3.38-25.37-10.13-6.12-6.8-9.18-15.94-9.18-27.41s3.19-21.22,9.59-27.88c6.44-6.71,14.9-10.07,25.37-10.07,8.39,0,15.44,2.28,21.15,6.83s9.16,10.64,10.34,18.26h-11.97c-1.18-4.85-3.54-8.55-7.07-11.09-3.54-2.54-7.87-3.81-12.99-3.81-6.49,0-11.78,2.11-15.88,6.32-4.11,4.22-6.16,9.68-6.16,16.39v11.02c0,6.48,2.02,11.7,6.05,15.64s9.36,5.92,15.98,5.92c5.35,0,9.87-1.46,13.57-4.39s6-6.86,6.9-11.8Z"/>
<path class="cls-1" d="m459.29,176.41h-12.11v-102.08h12.11v42.64h.89c2.27-4.53,5.58-8.12,9.93-10.75,4.35-2.63,9.2-3.94,14.55-3.94,7.84,0,14.01,2.63,18.5,7.89,4.49,5.26,6.73,12.4,6.73,21.42v44.82h-11.97v-43.59c0-13.56-5.76-20.33-17.27-20.33-6.39,0-11.55,2.32-15.47,6.97-3.92,4.65-5.88,10.83-5.88,18.53v38.43Z"/>
<path class="cls-1" d="m559.84,102.28c9.98,0,17.85,2.94,23.63,8.81,5.78,5.87,8.67,13.86,8.67,23.97,0,2.72-.14,5.21-.41,7.48h-53.66v4.22c0,6.39,2.02,11.54,6.05,15.44,4.03,3.9,9.4,5.85,16.12,5.85,5.08,0,9.44-1.22,13.09-3.67s6.06-5.74,7.24-9.86h11.97c-1.59,7.16-5.3,12.83-11.15,17-6.03,4.17-13.17,6.26-21.43,6.26-10.56,0-18.92-3.41-25.06-10.24-6.14-6.82-9.21-16.08-9.21-27.78s3.05-20.81,9.15-27.48,14.43-10,24.99-10Zm-21.76,29.45v1.9h42.1v-2.79c0-5.62-1.87-10.16-5.61-13.6-3.74-3.45-8.65-5.17-14.73-5.17-6.39,0-11.62,1.81-15.68,5.44-4.06,3.63-6.09,8.37-6.09,14.21Z"/>
<path class="cls-1" d="m621.36,90.17h-11.97v-15.85h11.97v15.85Zm0,86.24h-11.97v-72.7h11.97v72.7Z"/>
<path class="cls-1" d="m638.19,140.02c0-11.7,3.19-20.88,9.59-27.54,6.39-6.8,14.85-10.2,25.37-10.2s18.93,3.36,25.23,10.07c6.39,6.66,9.59,15.89,9.59,27.68s-3.09,20.8-9.25,27.58c-6.17,6.78-14.69,10.17-25.57,10.17s-19.43-3.38-25.64-10.13c-6.21-6.76-9.32-15.96-9.32-27.61Zm12.38-5.24v11.29c0,6.71,2.12,12,6.36,15.88,4.24,3.88,9.65,5.81,16.22,5.81s12.04-1.96,16.25-5.88c4.22-3.92,6.33-9.19,6.33-15.81v-11.29c0-6.66-2.1-12.05-6.29-16.15-4.19-4.1-9.62-6.15-16.29-6.15s-11.95,2.09-16.26,6.26c-4.22,4.08-6.32,9.43-6.32,16.05Z"/>
<path class="cls-1" d="m737.04,176.41h-12.11v-72.7h10.61l1.5,13.53h1.02c2.27-4.67,5.54-8.33,9.82-10.98,4.29-2.65,9.17-3.98,14.66-3.98,7.8,0,13.95,2.65,18.46,7.96,4.51,5.3,6.77,12.47,6.77,21.49v44.68h-12.11v-43.46c0-13.28-5.71-19.93-17.14-19.93-6.39,0-11.57,2.34-15.54,7.01-3.97,4.67-5.95,10.79-5.95,18.36v38.02Z"/>
</g>
<path class="cls-1" d="m807.71,159.48c2.39,0,4.38.77,5.96,2.32,1.6,1.54,2.4,3.53,2.4,5.96s-.8,4.42-2.4,5.96c-1.62,1.56-3.61,2.34-5.96,2.34s-4.34-.78-5.93-2.34c-1.58-1.55-2.37-3.54-2.37-5.96s.79-4.41,2.37-5.96,3.56-2.32,5.93-2.32Zm7.34,8.28c0-2.18-.7-3.95-2.11-5.33-1.41-1.41-3.15-2.11-5.23-2.11s-3.8.7-5.2,2.11c-1.39,1.42-2.08,3.2-2.08,5.36s.69,3.91,2.08,5.27c1.43,1.37,3.17,2.05,5.23,2.05s3.81-.68,5.2-2.05c1.41-1.38,2.11-3.14,2.11-5.3Zm-9.05,4.03h-1.35v-8.19h3.97c.77,0,1.36.21,1.78.62s.62.99.62,1.73c0,1.05-.41,1.71-1.23,1.99v.11h.38c.59,0,.88.3.88.91v2.83h-1.32v-3.05h-3.73v3.05Zm0-7.05v2.89h2.31c.39,0,.7-.11.94-.32s.35-.5.35-.85v-.63c0-.33-.11-.59-.33-.79s-.51-.3-.87-.3h-2.4Z"/>
</g>
<g>
<path class="cls-1" d="m169.78,121.53c-4.59,7.99-16.72,29.1-19.54,33.99-.36.63-1.04,1.02-1.77,1.02h-41.54c-1.57,0-2.55,1.7-1.77,3.06l19.79,34.41c.36.63,1.04,1.02,1.77,1.02h43.91c.73,0,1.41-.39,1.77-1.03l20.66-36.02c.36-.63.36-1.4,0-2.03l-19.73-34.42c-.78-1.37-2.76-1.37-3.54,0Z"/>
<path class="cls-1" d="m106.97,133.32l-7.34-12.77c-.79-1.37-2.76-1.37-3.54,0l-19.99,34.85c-.36.64-1.04,1.03-1.77,1.03h-40.42c-1.57,0-2.55,1.7-1.77,3.06l19.77,34.51c.36.64,1.04,1.03,1.77,1.03h42.01c.73,0,1.41-.39,1.77-1.03l9.4-16.39c.36-.63.36-1.41,0-2.04l-11-19.13c-.36-.63-.36-1.42,0-2.05l11.11-19.04c.37-.63.37-1.41,0-2.05Z"/>
<path class="cls-1" d="m101.3,111.06l12.29,21.42c.36.64,1.04,1.03,1.77,1.03h16.67c.73,0,1.41-.39,1.77-1.03l22.31-38.91c.36-.63.36-1.4,0-2.03l-19.2-33.46c-.79-1.37-2.76-1.37-3.54,0l-19.92,34.73c-.36.64-1.04,1.03-1.77,1.03h-41.6c-1.57,0-2.55,1.7-1.77,3.06l6.94,12.1c.36.63,1.04,1.03,1.77,1.03h22.51c.73,0,1.41.39,1.77,1.03Z"/>
<polygon class="cls-1" points="107.28 133.51 107.27 133.51 107.27 133.52 107.28 133.51"/>
</g>
</svg>
\ No newline at end of file
static/assets/images/adopters/logo-avantronics-white.png

27.7 KiB