code: @Override
      public URI addService(Service service) throws ServiceException {
          // Check input and exit early
          if (service == null)
              throw new ServiceException("No service provided.");
  
          if (!this.graphStoreManager.canBeModified()) {
              log.warn("The dataset cannot be modified. Unable to store the service.");
              return null;
          }
  
          URI newBaseServiceUri = this.generateUniqueServiceUri();
          // Replace URIs in service description
          try {
              replaceUris(service, newBaseServiceUri);
          } catch (URISyntaxException e) {
              log.error("Unable to create URI for service", e);
              throw new ServiceException("Unable to create URI for service", e);
          }
  
          // Store in backend
          ServiceWriterImpl writer = new ServiceWriterImpl();
          Model svcModel = writer.generateModel(service);
          log.info("Adding service - {}", service.getUri().toASCIIString());
          // The graph id corresponds is the base id
          this.graphStoreManager.putGraph(newBaseServiceUri, svcModel);
  
          // Generate Event
          this.getEventBus().post(new ServiceCreatedEvent(new Date(), service));
  
          return service.getUri();
      }
docs: Creates a Service Description in the system.
  Only needs to be fed with an MSM Service description.
  
  After successfully adding a service, implementations of this method should raise a {@code ServiceCreatedEvent}
  
  @param service the input service description in terms of MSM
  @return the URI this service description was saved to
  @throws uk.ac.open.kmi.iserve.sal.exception.ServiceException