Skip to content

Commit

Permalink
Environment representation in domain refactored
Browse files Browse the repository at this point in the history
  • Loading branch information
Felipe444 committed Sep 4, 2020
1 parent 6e86700 commit f0d687d
Show file tree
Hide file tree
Showing 18 changed files with 176 additions and 179 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public <C, E> EnvironmentValidatorResult validateServiceAgainstEnvironments(
) {
List<ServiceContracts> environmentContracts = environments.stream()
.flatMap(env -> this.environmentRepository.get(env).getAllServices().stream())
.map(sv -> this.serviceContractsRepository.findOne(sv))
.map(service -> this.serviceContractsRepository.findOne(new ServiceVersion(service.getName(), service.getVersion())))
.filter(Optional::isPresent)
.map(Optional::get)
.collect(toList());
Expand All @@ -48,7 +48,7 @@ public <C, E> Map<ServiceVersion, EnvironmentValidatorResult> validatedServicesA
// find contracts on given env
List<ServiceContracts> environmentContracts = this.environmentRepository.get(env).getAllServices()
.stream()
.map(sv -> this.serviceContractsRepository.findOne(sv))
.map(service -> this.serviceContractsRepository.findOne(new ServiceVersion(service.getName(), service.getVersion())))
.filter(Optional::isPresent)
.map(Optional::get)
.collect(toList());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@
@Access(AccessType.FIELD)
@MappedSuperclass
public class ServiceVersion implements Serializable {

private String name;
private String version;

}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,80 +1,39 @@
package com.hltech.judged.server.domain.environment;

import com.google.common.collect.SetMultimap;
import com.hltech.judged.server.domain.ServiceVersion;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;

import static com.google.common.collect.HashMultimap.create;

@Getter
@RequiredArgsConstructor
public class Environment {

public static final String DEFAULT_NAMESPACE = "default";

private final String name;
private final SetMultimap<String, ServiceVersion> serviceVersions;

public Environment(String name, SetMultimap<String, ServiceVersion> serviceVersions) {
this.name = name;
this.serviceVersions = serviceVersions;
}

public Environment(String name, Set<ServiceVersion> serviceVersions) {
this.name = name;
this.serviceVersions = create();
this.serviceVersions.putAll(DEFAULT_NAMESPACE, serviceVersions);
}

public String getName() {
return this.name;
}
private final Set<Space> spaces;

public Set<String> getSpaceNames() {
return serviceVersions.keySet();
}

public Set<ServiceVersion> getServices(String space) {
return serviceVersions.get(space);
}

public Set<ServiceVersion> getAllServices() {
return serviceVersions.values().stream()
return spaces.stream()
.map(Space::getName)
.collect(Collectors.toUnmodifiableSet());
}

public static Environment empty(String environmentName) {
return new Environment(environmentName, new HashSet<>());
public Set<Service> getServices(String spaceName) {
return spaces.stream()
.filter(space -> space.getName().equals(spaceName))
.findAny()
.map(Space::getServices)
.orElse(new HashSet<>());
}

public static EnvironmentBuilder builder(String name) {
return new EnvironmentBuilder(name);
}

public static class EnvironmentBuilder {

private final String name;
// <space, serviceVersion>
private final SetMultimap<String, ServiceVersion> serviceVersions = create();

private EnvironmentBuilder(String name) {
this.name = name;
}

public EnvironmentBuilder withServiceVersion(String space, ServiceVersion serviceVersion) {
this.serviceVersions.put(space, serviceVersion);
return this;
}

public EnvironmentBuilder withServiceVersions(String space, Set<ServiceVersion> serviceVersions) {
this.serviceVersions.putAll(space, serviceVersions);
return this;
}

public Environment build() {
return new Environment(this.name, this.serviceVersions);
}

public Set<Service> getAllServices() {
return spaces.stream()
.flatMap(space -> space.getServices().stream())
.collect(Collectors.toUnmodifiableSet());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.hltech.judged.server.domain.environment;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
@EqualsAndHashCode
public class Service {
private final String name;
private final String version;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.hltech.judged.server.domain.environment;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

import java.util.Set;

@Getter
@RequiredArgsConstructor
@EqualsAndHashCode
public class Space {
private final String name;
private final Set<Service> services;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.hltech.judged.server.domain.contracts.ServiceContracts;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.hltech.judged.server.infrastructure.persistence.environment;

import com.hltech.judged.server.domain.SpaceServiceVersion;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
Expand Down Expand Up @@ -30,9 +29,9 @@ public class EnvironmentTuple {
@Id
private String name;

@ElementCollection(fetch = FetchType.EAGER, targetClass = SpaceServiceVersion.class)
@ElementCollection(fetch = FetchType.EAGER, targetClass = ServiceVersion.class)
@JoinTable(name = "service_versions", joinColumns = {
@JoinColumn(name = "environment_name", referencedColumnName = "name"),
})
private Set<SpaceServiceVersion> spaceServiceVersions;
private Set<ServiceVersion> serviceVersions;
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package com.hltech.judged.server.infrastructure.persistence.environment;

import com.hltech.judged.server.domain.ServiceVersion;
import com.hltech.judged.server.domain.SpaceServiceVersion;
import com.hltech.judged.server.domain.environment.Environment;
import com.hltech.judged.server.domain.environment.EnvironmentRepository;
import com.hltech.judged.server.domain.environment.Service;
import com.hltech.judged.server.domain.environment.Space;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

Expand All @@ -31,30 +33,41 @@ public Set<String> getNames() {
public Environment get(String name) {
return springDataEnvironmentRepository.findById(name)
.map(this::toEnvironment)
.orElse(Environment.empty(name));
.orElse(new Environment(name, new HashSet<>()));
}

private EnvironmentTuple toEnvironmentTuple(Environment environment) {
return new EnvironmentTuple(environment.getName(), getSpaceServiceVersions(environment));
}

private Set<SpaceServiceVersion> getSpaceServiceVersions(Environment environment) {
private Set<ServiceVersion> getSpaceServiceVersions(Environment environment) {
return environment.getSpaceNames().stream()
.flatMap(space -> environment.getServices(space).stream()
.map(serviceVersion -> new SpaceServiceVersion(space, serviceVersion.getName(), serviceVersion.getVersion())))
.map(service -> new ServiceVersion(space, service.getName(), service.getVersion())))
.collect(Collectors.toUnmodifiableSet());
}

private Environment toEnvironment(EnvironmentTuple environmentTuple) {
Environment.EnvironmentBuilder environmentBuilder = Environment.builder(environmentTuple.getName());
Set<Space> spaces = new HashSet<>();

environmentTuple.getSpaceServiceVersions().forEach(spaceServiceVersion ->
environmentBuilder.withServiceVersion(
spaceServiceVersion.getSpace(),
new ServiceVersion(spaceServiceVersion.getName(), spaceServiceVersion.getVersion())
)
);
environmentTuple.getServiceVersions()
.forEach(serviceVersion -> {
Optional<Space> foundSpace = spaces.stream()
.filter(space -> space.getName().equals(serviceVersion.getSpace()))
.findAny();

return environmentBuilder.build();
if (foundSpace.isPresent()) {
Set<Service> services = new HashSet<>(foundSpace.get().getServices());
services.add(new Service(serviceVersion.getName(), serviceVersion.getVersion()));

spaces.add(new Space(foundSpace.get().getName(), services));
return;
}

spaces.add(new Space(serviceVersion.getSpace(), Set.of(new Service(serviceVersion.getName(), serviceVersion.getVersion()))));
});

return new Environment(environmentTuple.getName(), spaces);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.hltech.judged.server.infrastructure.persistence.environment;

import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.Access;
import javax.persistence.AccessType;
import javax.persistence.Embeddable;

import static lombok.AccessLevel.PROTECTED;

@Embeddable
@Getter
@EqualsAndHashCode
@NoArgsConstructor(access = PROTECTED)
@AllArgsConstructor
@Access(AccessType.FIELD)
public class ServiceVersion {
private String space;
private String name;
private String version;
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.hltech.judged.server.interfaces.rest.environment;

import com.google.common.collect.ImmutableSet;
import com.hltech.judged.server.domain.ServiceVersion;
import com.hltech.judged.server.domain.environment.Environment;
import com.hltech.judged.server.domain.environment.Environment.EnvironmentBuilder;
import com.hltech.judged.server.domain.environment.EnvironmentRepository;
import com.hltech.judged.server.domain.environment.Service;
import com.hltech.judged.server.domain.environment.Space;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
Expand All @@ -17,6 +17,7 @@
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

Expand Down Expand Up @@ -62,7 +63,7 @@ public List<ServiceDto> getEnvironment(@PathVariable("name") String name) {
public void overwriteEnvironment(
@PathVariable("name") String name,
@RequestHeader(value = "X-JUDGE-D-AGENT-SPACE", defaultValue = DEFAULT_NAMESPACE, required = false) String agentSpace,
@RequestBody Set<ServiceForm> services
@RequestBody Set<ServiceForm> serviceForms
) {
agentSpace = firstNonNull(agentSpace, DEFAULT_NAMESPACE);
Environment environment = environmentRepository.get(name);
Expand All @@ -71,19 +72,19 @@ public void overwriteEnvironment(
.add(agentSpace)
.build();

EnvironmentBuilder builder = Environment.builder(name);
for (String space : supportedSpaces) {
if (agentSpace.equals(space)) {
Set<ServiceVersion> serviceVersions = services.stream()
.map(sf -> new ServiceVersion(sf.getName(), sf.getVersion()))
Set<Space> spaces = new HashSet<>();
for (String spaceName : supportedSpaces) {
if (agentSpace.equals(spaceName)) {
Set<Service> services = serviceForms.stream()
.map(sf -> new Service(sf.getName(), sf.getVersion()))
.collect(toSet());

builder.withServiceVersions(agentSpace, serviceVersions);
spaces.add(new Space(spaceName, services));
} else {
builder.withServiceVersions(space, environment.getServices(space));
spaces.add(new Space(spaceName, environment.getServices(spaceName)));
}
}

environmentRepository.persist(builder.build());
environmentRepository.persist(new Environment(name, spaces));
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.hltech.judged.server.interfaces.rest.interrelationship;

import com.hltech.judged.server.domain.environment.Service;
import com.hltech.judged.server.interfaces.rest.contracts.ServiceContractsDto;
import com.hltech.judged.server.domain.contracts.ServiceContracts;
import com.hltech.judged.server.domain.contracts.ServiceContractsRepository;
Expand Down Expand Up @@ -45,8 +46,8 @@ public InterrelationshipDto getInterrelationship (@PathVariable("environment") S
return new InterrelationshipDto(env, serviceContractsSet);
}

private ServiceContracts getServiceContracts(ServiceVersion service) {
return serviceContractsRepository.findOne(service)
private ServiceContracts getServiceContracts(Service service) {
return serviceContractsRepository.findOne(new ServiceVersion(service.getName(), service.getVersion()))
.orElseGet(() ->
new ServiceContracts(
new ServiceVersion(service.getName(), service.getVersion()),
Expand Down
Loading

0 comments on commit f0d687d

Please sign in to comment.