diff --git a/src/main/java/io/gravitee/repository/redis/management/RedisApiRepository.java b/src/main/java/io/gravitee/repository/redis/management/RedisApiRepository.java index cd8ced8..6894f3b 100644 --- a/src/main/java/io/gravitee/repository/redis/management/RedisApiRepository.java +++ b/src/main/java/io/gravitee/repository/redis/management/RedisApiRepository.java @@ -27,7 +27,8 @@ import java.util.stream.Collectors; /** - * @author David BRASSELY (brasseld at gmail.com) + * @author David BRASSELY (david.brassely at graviteesource.com) + * @author Nicolas GERAUD (nicolas.geraud at graviteesource.com) * @author GraviteeSource Team */ @Component @@ -59,6 +60,14 @@ public Set findByIds(List ids) throws TechnicalException { .collect(Collectors.toSet()); } + @Override + public Set findByGroups(List groupIds) throws TechnicalException { + return apiRedisRepository.findByGroups(groupIds) + .stream() + .map(this::convert) + .collect(Collectors.toSet()); + } + @Override public Optional findById(String apiId) throws TechnicalException { RedisApi redisApi = this.apiRedisRepository.find(apiId); @@ -102,6 +111,7 @@ private Api convert(RedisApi redisApi) { api.setVisibility(Visibility.valueOf(redisApi.getVisibility())); api.setLifecycleState(LifecycleState.valueOf(redisApi.getLifecycleState())); api.setPicture(redisApi.getPicture()); + api.setGroup(redisApi.getGroup()); return api; } @@ -124,6 +134,7 @@ private RedisApi convert(Api api) { redisApi.setVisibility(api.getVisibility().name()); redisApi.setLifecycleState(api.getLifecycleState().name()); redisApi.setPicture(api.getPicture()); + redisApi.setGroup(api.getGroup()); return redisApi; } diff --git a/src/main/java/io/gravitee/repository/redis/management/RedisApplicationRepository.java b/src/main/java/io/gravitee/repository/redis/management/RedisApplicationRepository.java index b6dfa01..b6803c9 100644 --- a/src/main/java/io/gravitee/repository/redis/management/RedisApplicationRepository.java +++ b/src/main/java/io/gravitee/repository/redis/management/RedisApplicationRepository.java @@ -27,7 +27,8 @@ import java.util.stream.Collectors; /** - * @author David BRASSELY (brasseld at gmail.com) + * @author David BRASSELY (david.brassely at graviteesource.com) + * @author Nicolas GERAUD (nicolas.geraud at graviteesource.com) * @author GraviteeSource Team */ @Component @@ -52,6 +53,14 @@ public Set findByIds(List ids) throws TechnicalException { .collect(Collectors.toSet()); } + @Override + public Set findByGroups(List groupIds) throws TechnicalException { + return applicationRedisRepository.findByGroups(groupIds) + .stream() + .map(this::convert) + .collect(Collectors.toSet()); + } + @Override public Optional findById(String applicationId) throws TechnicalException { RedisApplication redisApplication = this.applicationRedisRepository.find(applicationId); @@ -96,6 +105,7 @@ private Application convert(RedisApplication redisApplication) { application.setUpdatedAt(new Date(redisApplication.getUpdatedAt())); application.setDescription(redisApplication.getDescription()); application.setType(redisApplication.getType()); + application.setGroup(redisApplication.getGroup()); return application; } @@ -108,6 +118,7 @@ private RedisApplication convert(Application application) { redisApplication.setUpdatedAt(application.getUpdatedAt().getTime()); redisApplication.setDescription(application.getDescription()); redisApplication.setType(application.getType()); + redisApplication.setGroup(application.getGroup()); return redisApplication; } diff --git a/src/main/java/io/gravitee/repository/redis/management/RedisGroupRepository.java b/src/main/java/io/gravitee/repository/redis/management/RedisGroupRepository.java new file mode 100644 index 0000000..a3aecfc --- /dev/null +++ b/src/main/java/io/gravitee/repository/redis/management/RedisGroupRepository.java @@ -0,0 +1,107 @@ +/** + * Copyright (C) 2015 The Gravitee team (http://gravitee.io) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.gravitee.repository.redis.management; + +import io.gravitee.repository.exceptions.TechnicalException; +import io.gravitee.repository.management.api.GroupRepository; +import io.gravitee.repository.management.model.Group; +import io.gravitee.repository.redis.management.internal.GroupRedisRepository; +import io.gravitee.repository.redis.management.model.RedisGroup; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author Nicolas GERAUD (nicolas.geraud at graviteesource.com) + * @author GraviteeSource Team + */ +@Component +public class RedisGroupRepository implements GroupRepository{ + + @Autowired + private GroupRedisRepository internalRepository; + + @Override + public Optional findById(String groupId) throws TechnicalException { + return Optional.ofNullable(convert(internalRepository.find(groupId))); + } + + @Override + public Group create(Group item) throws TechnicalException { + if (item != null && item.getAdministrators() == null) { + item.setAdministrators(Collections.emptyList()); + } + return convert(internalRepository.saveOrUpdate(convert(item))); + } + + @Override + public Group update(Group item) throws TechnicalException { + return convert(internalRepository.saveOrUpdate(convert(item))); + } + + @Override + public void delete(String groupId) throws TechnicalException { + internalRepository.delete(groupId); + } + + @Override + public Set findByType(Group.Type type) throws TechnicalException { + return internalRepository.findByType(type.name()) + .stream() + .map(this::convert) + .collect(Collectors.toSet()); + } + + @Override + public Set findAll() throws TechnicalException { + return internalRepository.findAll() + .stream() + .map(this::convert) + .collect(Collectors.toSet()); + } + + private Group convert(RedisGroup redisGroup) { + if (redisGroup==null) { + return null; + } + Group group = new Group(); + group.setId(redisGroup.getId()); + group.setName(redisGroup.getName()); + group.setType(Group.Type.valueOf(redisGroup.getType())); + group.setCreatedAt(redisGroup.getCreatedAt()); + group.setUpdatedAt(redisGroup.getUpdatedAt()); + group.setAdministrators(redisGroup.getAdminstrators()); + return group; + } + + private RedisGroup convert(Group group) { + if (group==null) { + return null; + } + RedisGroup redisGroup = new RedisGroup(); + redisGroup.setId(group.getId()); + redisGroup.setName(group.getName()); + redisGroup.setType(group.getType().name()); + redisGroup.setCreatedAt(group.getCreatedAt()); + redisGroup.setUpdatedAt(group.getUpdatedAt()); + redisGroup.setAdminstrators(group.getAdministrators()); + return redisGroup; + } +} diff --git a/src/main/java/io/gravitee/repository/redis/management/internal/ApiRedisRepository.java b/src/main/java/io/gravitee/repository/redis/management/internal/ApiRedisRepository.java index 333a252..9971303 100644 --- a/src/main/java/io/gravitee/repository/redis/management/internal/ApiRedisRepository.java +++ b/src/main/java/io/gravitee/repository/redis/management/internal/ApiRedisRepository.java @@ -21,7 +21,8 @@ import java.util.Set; /** - * @author David BRASSELY (brasseld at gmail.com) + * @author David BRASSELY (david.brassely at graviteesource.com) + * @author Nicolas GERAUD (nicolas.geraud at graviteesource.com) * @author GraviteeSource Team */ public interface ApiRedisRepository { @@ -34,6 +35,8 @@ public interface ApiRedisRepository { Set findByVisibility(String visibility); + Set findByGroups(List groupIds); + RedisApi saveOrUpdate(RedisApi api); void delete(String api); diff --git a/src/main/java/io/gravitee/repository/redis/management/internal/ApplicationRedisRepository.java b/src/main/java/io/gravitee/repository/redis/management/internal/ApplicationRedisRepository.java index 42eaf7c..a551334 100644 --- a/src/main/java/io/gravitee/repository/redis/management/internal/ApplicationRedisRepository.java +++ b/src/main/java/io/gravitee/repository/redis/management/internal/ApplicationRedisRepository.java @@ -33,6 +33,8 @@ public interface ApplicationRedisRepository { Set findAll(); + Set findByGroups(List groupIds); + RedisApplication saveOrUpdate(RedisApplication application); void delete(String application); diff --git a/src/main/java/io/gravitee/repository/redis/management/internal/GroupRedisRepository.java b/src/main/java/io/gravitee/repository/redis/management/internal/GroupRedisRepository.java new file mode 100644 index 0000000..e965625 --- /dev/null +++ b/src/main/java/io/gravitee/repository/redis/management/internal/GroupRedisRepository.java @@ -0,0 +1,38 @@ +/** + * Copyright (C) 2015 The Gravitee team (http://gravitee.io) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.gravitee.repository.redis.management.internal; + +import io.gravitee.repository.redis.management.model.RedisGroup; + +import java.util.Set; + +/** + * @author Nicolas GERAUD (nicolas.geraud at graviteesource.com) + * @author GraviteeSource Team + */ +public interface GroupRedisRepository { + + + RedisGroup find(String groupId); + + Set findByType(String type); + + Set findAll(); + + RedisGroup saveOrUpdate(RedisGroup group); + + void delete(String groupId); +} diff --git a/src/main/java/io/gravitee/repository/redis/management/internal/impl/ApiRedisRepositoryImpl.java b/src/main/java/io/gravitee/repository/redis/management/internal/impl/ApiRedisRepositoryImpl.java index 01ddaa0..5039009 100644 --- a/src/main/java/io/gravitee/repository/redis/management/internal/impl/ApiRedisRepositoryImpl.java +++ b/src/main/java/io/gravitee/repository/redis/management/internal/impl/ApiRedisRepositoryImpl.java @@ -22,14 +22,12 @@ import org.springframework.data.redis.core.RedisCallback; import org.springframework.stereotype.Component; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; /** - * @author David BRASSELY (brasseld at gmail.com) + * @author David BRASSELY (david.brassely at graviteesource.com) + * @author Nicolas GERAUD (nicolas.geraud at graviteesource.com) * @author GraviteeSource Team */ @Component @@ -74,6 +72,17 @@ public Set findByVisibility(String visibility) { .collect(Collectors.toSet()); } + @Override + public Set findByGroups(List groups) { + Set keys = new HashSet<>(); + groups.forEach(group ->keys.addAll(redisTemplate.opsForSet().members(REDIS_KEY + ":group:" + group))); + List apiObjects = redisTemplate.opsForHash().multiGet(REDIS_KEY, keys); + + return apiObjects.stream() + .map(event -> convert(event, RedisApi.class)) + .collect(Collectors.toSet()); + } + @Override public RedisApi saveOrUpdate(RedisApi api) { RedisApi oldApi = find(api.getId()); @@ -81,9 +90,17 @@ public RedisApi saveOrUpdate(RedisApi api) { @Override public Object doInRedis(RedisConnection connection) throws DataAccessException { redisTemplate.opsForHash().put(REDIS_KEY, api.getId(), api); - redisTemplate.opsForSet().add(REDIS_KEY + ":visibility:" + api.getVisibility(), api.getId()); + if (oldApi != null) { redisTemplate.opsForSet().remove(REDIS_KEY + ":visibility:" + oldApi.getVisibility(), api.getId()); + if(oldApi.getGroup() != null) { + redisTemplate.opsForSet().remove(REDIS_KEY + ":group:" + oldApi.getGroup(), api.getId()); + } + } + + redisTemplate.opsForSet().add(REDIS_KEY + ":visibility:" + api.getVisibility(), api.getId()); + if(api.getGroup() != null) { + redisTemplate.opsForSet().add(REDIS_KEY + ":group:" + api.getGroup(), api.getId()); } return null; diff --git a/src/main/java/io/gravitee/repository/redis/management/internal/impl/ApplicationRedisRepositoryImpl.java b/src/main/java/io/gravitee/repository/redis/management/internal/impl/ApplicationRedisRepositoryImpl.java index 7720fde..b04d6ee 100644 --- a/src/main/java/io/gravitee/repository/redis/management/internal/impl/ApplicationRedisRepositoryImpl.java +++ b/src/main/java/io/gravitee/repository/redis/management/internal/impl/ApplicationRedisRepositoryImpl.java @@ -19,14 +19,12 @@ import io.gravitee.repository.redis.management.model.RedisApplication; import org.springframework.stereotype.Component; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; /** - * @author David BRASSELY (brasseld at gmail.com) + * @author David BRASSELY (david.brassely at graviteesource.com) + * @author Nicolas GERAUD (nicolas.geraud at graviteesource.com) * @author GraviteeSource Team */ @Component @@ -64,9 +62,24 @@ public Set findAll() { @Override public RedisApplication saveOrUpdate(RedisApplication application) { redisTemplate.opsForHash().put(REDIS_KEY, application.getId(), application); + if(application.getGroup() != null) { + redisTemplate.opsForSet().add(REDIS_KEY + ":group:" + application.getGroup(), application.getId()); + } return application; } + + @Override + public Set findByGroups(List groups) { + Set keys = new HashSet<>(); + groups.forEach(group->keys.addAll(redisTemplate.opsForSet().members(REDIS_KEY + ":group:" + group))); + List apiObjects = redisTemplate.opsForHash().multiGet(REDIS_KEY, keys); + + return apiObjects.stream() + .map(event -> convert(event, RedisApplication.class)) + .collect(Collectors.toSet()); + } + @Override public void delete(String application) { redisTemplate.opsForHash().delete(REDIS_KEY, application); diff --git a/src/main/java/io/gravitee/repository/redis/management/internal/impl/GroupRedisRepositoryImpl.java b/src/main/java/io/gravitee/repository/redis/management/internal/impl/GroupRedisRepositoryImpl.java new file mode 100644 index 0000000..58f627e --- /dev/null +++ b/src/main/java/io/gravitee/repository/redis/management/internal/impl/GroupRedisRepositoryImpl.java @@ -0,0 +1,78 @@ +/** + * Copyright (C) 2015 The Gravitee team (http://gravitee.io) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.gravitee.repository.redis.management.internal.impl; + +import io.gravitee.repository.redis.management.internal.GroupRedisRepository; +import io.gravitee.repository.redis.management.internal.PageRedisRepository; +import io.gravitee.repository.redis.management.model.RedisGroup; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author Nicolas GERAUD (nicolas.geraud at graviteesource.com) + * @author GraviteeSource Team + */ +@Component +public class GroupRedisRepositoryImpl extends AbstractRedisRepository implements GroupRedisRepository { + + private final static String REDIS_KEY = "group"; + + @Override + public RedisGroup find(String groupId) { + Object group = redisTemplate.opsForHash().get(REDIS_KEY, groupId); + if (group == null) { + return null; + } + + return convert(group, RedisGroup.class); + } + + @Override + public RedisGroup saveOrUpdate(RedisGroup group) { + redisTemplate.opsForHash().put(REDIS_KEY, group.getId(), group); + redisTemplate.opsForSet().add(REDIS_KEY + ":type:" + group.getType(), group.getId()); + return group; + } + + @Override + public void delete(String groupId) { + RedisGroup group = find(groupId); + redisTemplate.opsForHash().delete(REDIS_KEY, groupId); + redisTemplate.opsForSet().remove(REDIS_KEY + ":type:" + group.getType(), groupId); + } + + @Override + public Set findByType(String type) { + Set keys = redisTemplate.opsForSet().members(REDIS_KEY + ":type:" + type); + List groupObjects = redisTemplate.opsForHash().multiGet(REDIS_KEY, keys); + + return groupObjects.stream() + .map(grp -> convert(grp, RedisGroup.class)) + .collect(Collectors.toSet()); + } + + @Override + public Set findAll() { + return redisTemplate.opsForHash().entries(REDIS_KEY) + .values() + .stream() + .map(object -> convert(object, RedisGroup.class)) + .collect(Collectors.toSet()); + } +} diff --git a/src/main/java/io/gravitee/repository/redis/management/model/RedisApi.java b/src/main/java/io/gravitee/repository/redis/management/model/RedisApi.java index 764b555..faae90c 100644 --- a/src/main/java/io/gravitee/repository/redis/management/model/RedisApi.java +++ b/src/main/java/io/gravitee/repository/redis/management/model/RedisApi.java @@ -18,7 +18,8 @@ import java.util.Objects; /** - * @author David BRASSELY (brasseld at gmail.com) + * @author David BRASSELY (david.brassely at graviteesource.com) + * @author Nicolas GERAUD (nicolas.geraud at graviteesource.com) * @author GraviteeSource Team */ public class RedisApi { @@ -30,6 +31,7 @@ public class RedisApi { private String definition; private String lifecycleState; private String visibility; + private String group; private long deployedAt; private long createdAt; private long updatedAt; @@ -99,6 +101,14 @@ public void setVisibility(String visibility) { this.visibility = visibility; } + public String getGroup() { + return group; + } + + public void setGroup(String group) { + this.group = group; + } + public long getCreatedAt() { return createdAt; } diff --git a/src/main/java/io/gravitee/repository/redis/management/model/RedisApplication.java b/src/main/java/io/gravitee/repository/redis/management/model/RedisApplication.java index 621801b..3a9f956 100644 --- a/src/main/java/io/gravitee/repository/redis/management/model/RedisApplication.java +++ b/src/main/java/io/gravitee/repository/redis/management/model/RedisApplication.java @@ -18,7 +18,8 @@ import java.util.Objects; /** - * @author David BRASSELY (brasseld at gmail.com) + * @author David BRASSELY (david.brassely at graviteesource.com) + * @author Nicolas GERAUD (nicolas.geraud at graviteesource.com) * @author GraviteeSource Team */ public class RedisApplication { @@ -27,6 +28,8 @@ public class RedisApplication { private String name; private String description; private String type; + private String group; + private long createdAt; private long updatedAt; @@ -70,6 +73,14 @@ public void setType(String type) { this.type = type; } + public String getGroup() { + return group; + } + + public void setGroup(String group) { + this.group = group; + } + public long getUpdatedAt() { return updatedAt; } diff --git a/src/main/java/io/gravitee/repository/redis/management/model/RedisGroup.java b/src/main/java/io/gravitee/repository/redis/management/model/RedisGroup.java new file mode 100644 index 0000000..bedae51 --- /dev/null +++ b/src/main/java/io/gravitee/repository/redis/management/model/RedisGroup.java @@ -0,0 +1,94 @@ +/** + * Copyright (C) 2015 The Gravitee team (http://gravitee.io) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.gravitee.repository.redis.management.model; + +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * @author Nicolas GERAUD (nicolas.geraud at graviteesource.com) + * @author GraviteeSource Team + */ +public class RedisGroup { + private String id; + private String type; + private String name; + private Date createdAt; + private Date updatedAt; + private List adminstrators; + + public List getAdminstrators() { + return adminstrators; + } + + public void setAdminstrators(List adminstrators) { + this.adminstrators = adminstrators; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public Date getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + RedisGroup redisGroup = (RedisGroup) o; + return Objects.equals(id, redisGroup.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } +}