/* Copyright 2014 Danish Maritime Authority.
*
* 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 net.maritimecloud.portal.resource;
import java.util.List;
import javax.ws.rs.WebApplicationException;
import net.maritimecloud.portal.application.ApplicationServiceRegistry;
import net.maritimecloud.serviceregistry.command.organization.OrganizationId;
import net.maritimecloud.serviceregistry.command.serviceinstance.ServiceInstanceId;
import net.maritimecloud.serviceregistry.command.servicespecification.ServiceSpecificationId;
import net.maritimecloud.serviceregistry.domain.service.AliasGroups;
import net.maritimecloud.serviceregistry.query.AliasRegistryEntry;
import net.maritimecloud.serviceregistry.query.OrganizationEntry;
import net.maritimecloud.serviceregistry.query.ServiceInstanceEntry;
import net.maritimecloud.serviceregistry.query.ServiceSpecificationEntry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Helper class to assist with resolving resources based on id or aliases
* <p>
* @author Christoffer Børrild
*/
public class ResourceResolver {
private static final Logger LOG = LoggerFactory.getLogger(ResourceResolver.class);
public static String resolveOrganizationIdOrFail(String organizationAliasOrId) {
String organizationId = resolveOrganizationId(organizationAliasOrId);
OrganizationEntry entry = ApplicationServiceRegistry.organizationQueryRepository().findOne(organizationId);
assertNotNull(entry, "Unable to find Organization based on key=" + organizationAliasOrId);
return organizationId;
}
public static ServiceSpecificationEntry resolveServiceSpecification(String organizationId, String serviceSpecificationAliasOrId) {
String serviceSpecificationId = resolveServiceSpecificationId(organizationId, serviceSpecificationAliasOrId);
ServiceSpecificationEntry serviceSpecification = lookupServiceSpecification(serviceSpecificationId);
assertBelongsToOrganization(organizationId, serviceSpecification);
return serviceSpecification;
}
public static String resolveServiceSpecificationId(String organizationId, String serviceSpecificationAliasOrId) {
AliasRegistryEntry aliasEntry = lookupServiceSpecificationAliasEntry(organizationId, serviceSpecificationAliasOrId);
return chooseIdFrom(aliasEntry, serviceSpecificationAliasOrId);
}
public static ServiceInstanceEntry resolveServiceInstance(String organizationId, String serviceInstanceAliasOrId) {
String serviceInstanceId = resolveServiceInstanceId(organizationId, serviceInstanceAliasOrId);
ServiceInstanceEntry serviceInstance = lookupServiceInstance(serviceInstanceId);
assertBelongsToOrganization(organizationId, serviceInstance);
return serviceInstance;
}
public static ServiceInstanceEntry lookupServiceInstance(String serviceInstanceId) {
final ServiceInstanceEntry entry = ApplicationServiceRegistry.serviceInstanceQueryRepository().findOne(serviceInstanceId);
assertNotNull(entry, "Unable to find service instance based on serviceInstanceId=" + serviceInstanceId);
return entry;
}
private static ServiceSpecificationEntry lookupServiceSpecification(String serviceSpecificationId) {
final ServiceSpecificationEntry entry = ApplicationServiceRegistry.serviceSpecificationQueryRepository().findOne(serviceSpecificationId);
assertNotNull(entry, "Unable to find service specification based on serviceInstanceId=" + serviceSpecificationId);
return entry;
}
private static String resolveOrganizationId(String organizationAliasOrId) {
AliasRegistryEntry aliasEntry = lookupOrganizationAliasEntry(organizationAliasOrId);
return chooseIdFrom(aliasEntry, organizationAliasOrId);
}
private static String resolveServiceInstanceId(String organizationId, String serviceInstanceAliasOrId) {
AliasRegistryEntry aliasEntry = lookupServiceInstanceAliasEntry(organizationId, serviceInstanceAliasOrId);
return chooseIdFrom(aliasEntry, serviceInstanceAliasOrId);
}
private static AliasRegistryEntry lookupOrganizationAliasEntry(String organizationAliasOrId) {
return lookupAlias(AliasGroups.USERS_AND_ORGANIZATIONS.name(), OrganizationId.class, organizationAliasOrId);
}
private static AliasRegistryEntry lookupServiceInstanceAliasEntry(String organizationId, String serviceInstanceAliasOrId) {
return lookupAlias(organizationId, ServiceInstanceId.class, serviceInstanceAliasOrId);
}
private static AliasRegistryEntry lookupServiceSpecificationAliasEntry(String organizationId, String serviceSpecificationAliasOrId) {
return lookupAlias(organizationId, ServiceSpecificationId.class, serviceSpecificationAliasOrId);
}
private static AliasRegistryEntry lookupAlias(String groupId, Class type, String alias) {
return ApplicationServiceRegistry.aliasRegistryQueryRepository().findByGroupIdAndTypeNameAndAlias(groupId, type.getName(), alias);
}
private static String chooseIdFrom(AliasRegistryEntry aliasEntry, String serviceSpecificationAliasOrId) {
return aliasEntry != null ? aliasEntry.getTargetId() : serviceSpecificationAliasOrId;
}
private static void assertBelongsToOrganization(String organizationId, ServiceInstanceEntry serviceInstance) {
if (!serviceInstance.getProviderId().equals(organizationId)) {
assertNotNull(null, "service instance is not own by organization");
}
}
private static void assertBelongsToOrganization(String organizationId, ServiceSpecificationEntry serviceSpecificationEntry) {
if (!serviceSpecificationEntry.getOwnerId().equals(organizationId)) {
assertNotNull(null, "service specification is not own by organization");
}
}
private static void assertNotNull(Object objectToTestForNull, String message) throws WebApplicationException {
if (objectToTestForNull == null) {
LOG.warn("Objct not found. {}", message);
throw new WebApplicationException(message, 404);
}
}
static List<AliasRegistryEntry> queryServiceinstanceAliases(ServiceInstanceEntry sie) {
return ApplicationServiceRegistry.aliasRegistryQueryRepository().findByGroupIdAndTypeNameAndTargetId(sie.getProviderId(), ServiceInstanceId.class.getName(), sie.getServiceInstanceId());
}
static List<AliasRegistryEntry> queryOrganizationAliases(String organizationId) {
return ApplicationServiceRegistry.aliasRegistryQueryRepository().findByGroupIdAndTypeNameAndTargetId(
AliasGroups.USERS_AND_ORGANIZATIONS.name(), OrganizationId.class.getName(), organizationId);
}
}