/* 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 net.maritimecloud.serviceregistry.query.OrganizationMembershipEntry;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import net.maritimecloud.portal.application.ApplicationServiceRegistry;
import net.maritimecloud.serviceregistry.query.OperationalServiceEntry;
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;
/**
* The AlmanacResource resembles the publicly available API part of the RegistryService.
* <p>
* This resource should be accessible by all users.
* <p>
* @author Christoffer Børrild
*/
@Path("/api/almanac")
public class AlmanacResource {
private static final Logger LOG = LoggerFactory.getLogger(AlmanacResource.class);
private static final List<OperationalServiceEntry> operationalServices = new ArrayList<>();
static {
System.out.println("FIXME: Hardcoding Operational Services!");
operationalServices.add(new OperationalServiceEntry("lps", "imo", "Local Port Services", "Summary of Local Port Services"));
operationalServices.add(new OperationalServiceEntry("mis", "imo", "Meteorological Information Services", "Summary of Meteorological Information Services"));
operationalServices.add(new OperationalServiceEntry("msi", "imo", "Maritime Safety Information", "Summary of Maritime Safety Information"));
operationalServices.add(new OperationalServiceEntry("msinm", "imo", "Maritime Safety Information & Notices to Mariners", "Summary of Maritime Safety Information & Notices to Mariners"));
operationalServices.add(new OperationalServiceEntry("nas", "imo", "Navigational Assistance Service", "Summary of Navigational Assistance Service"));
operationalServices.add(new OperationalServiceEntry("nga", "imo", "No-Go Area", "Summary of No-Go Area"));
operationalServices.add(new OperationalServiceEntry("rme", "imo", "Route METOC", "Summary of Route METOC"));
operationalServices.add(new OperationalServiceEntry("sre", "imo", "Strategical Route Exchange", "Summary of Strategical Route Exchange"));
operationalServices.add(new OperationalServiceEntry("tos", "imo", "Traffic Organization Service", "Summary of Traffic Organization Service"));
operationalServices.add(new OperationalServiceEntry("vsr", "imo", "Vessel Shore Reporting", "Summary of Vessel Shore Reporting"));
operationalServices.add(new OperationalServiceEntry("wvtsg", "imo", "World Vessel Traffic Services Guide", "Summary of World Vessel Traffic Services Guide"));
operationalServices.add(new OperationalServiceEntry("tre", "imo", "Tactical Route Exchange", "Summary of Tactical Route Exchange"));
operationalServices.add(new OperationalServiceEntry("tus", "imo", "Tugs Services", "Summary of Tugs Services"));
}
private void addHardcodedOperationalServicesHACK() {
// HACK HACK HACK
while (!operationalServices.isEmpty()) {
OperationalServiceEntry os = operationalServices.remove(0);
ApplicationServiceRegistry.operationalServiceQueryRepository().save(os);
System.out.println("Added hardcoded Operational Service to repository: " + os);
}
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("operational-service")
public Iterable<OperationalServiceEntry> queryOperationalServices(
) {
addHardcodedOperationalServicesHACK();
return ApplicationServiceRegistry.operationalServiceQueryRepository().findAll();
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("operational-service/{operationalServiceId}")
public OperationalServiceEntry getOperationalService(@PathParam("operationalServiceId") String operationalServiceId) {
addHardcodedOperationalServicesHACK();
return ApplicationServiceRegistry.operationalServiceQueryRepository().findOne(operationalServiceId);
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("organization")
public Iterable<OrganizationEntry> queryOrganizations(
) {
return ApplicationServiceRegistry.organizationQueryRepository().findAll();
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("organization/{organizationId}")
public OrganizationEntry getOrganization(@PathParam("organizationId") String organizationId) {
return ApplicationServiceRegistry.organizationQueryRepository().findOne(organizationId);
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("organization/{organizationId}/member")
public Iterable<OrganizationMembershipEntry> getOrganizationMembers(@PathParam("organizationId") String organizationId) {
return ApplicationServiceRegistry.organizationMembershipQueryRepository().findByOrganizationId(organizationId);
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("service-specification")
public Iterable<ServiceSpecificationEntry> queryServiceSpecifications(
@QueryParam("operationalServiceId") @DefaultValue("") String operationalServiceId,
@QueryParam("providerId") @DefaultValue("") String providerId,
@QueryParam("serviceType") @DefaultValue("") String serviceType,
@QueryParam("anyTextPattern") @DefaultValue("") String anyTextPattern
) {
if (operationalServiceId.isEmpty()) {
return ApplicationServiceRegistry.serviceSpecificationQueryRepository().findAll();
} else {
// FIXME: should query a mapping table with Operational Services mapped to this Specification instead
System.out.println("HACK: querying 'summary contains operation service id' instead of real lookup table! ");
return ApplicationServiceRegistry.serviceSpecificationQueryRepository().findBySummaryContains(operationalServiceId);
}
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("service-specification/{serviceSpecificationId}")
public ServiceSpecificationEntry getServiceSpecification(@PathParam("serviceSpecificationId") String serviceSpecificationId) {
return ApplicationServiceRegistry.serviceSpecificationQueryRepository().findOne(serviceSpecificationId);
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("service-instance")
public Iterable<ServiceInstanceEntry> queryInstances(
@QueryParam("operationalServiceId") @DefaultValue("") String operationalServiceId,
@QueryParam("serviceSpecificationIds") List<String> serviceSpecificationIds
) {
// Filter ServiceInstances that implements a SepcificationType that belongs to a specific OperationlaService category
if (!operationalServiceId.isEmpty()) {
// FIXME: should query a mapping table with Operational Services mapped to this Specification instead
System.out.println("HACK: querying 'summary contains operation service id' instead of real lookup table! ");
List<ServiceSpecificationEntry> serviceSpecifications
= ApplicationServiceRegistry.serviceSpecificationQueryRepository().findBySummaryContains(operationalServiceId);
if (serviceSpecifications.isEmpty()) {
// no result, return empty list
return new ArrayList();
} else {
serviceSpecifications.stream().forEach((spec) -> {
serviceSpecificationIds.add(spec.getServiceSpecificationId());
});
}
}
if (!serviceSpecificationIds.isEmpty()) {
System.out.println("serviceSpecificationIds: " + serviceSpecificationIds);
return ApplicationServiceRegistry.serviceInstanceQueryRepository().findBySpecificationIdIn(serviceSpecificationIds);
}
return ApplicationServiceRegistry.serviceInstanceQueryRepository().findAll();
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("service-instance/{serviceInstanceId}")
public ServiceInstanceEntry getInstance(
@PathParam("serviceInstanceId") String serviceInstanceId
) {
return ApplicationServiceRegistry.serviceInstanceQueryRepository().findOne(serviceInstanceId);
}
}