@Override
  @Transactional
  public List<Content> getAllContents() {
    List<Content> contents = new ArrayList<>();
    contents.addAll(streamContentService.retrieveAll());
    contents.addAll(stringContentService.retrieveAll());

    return contents;
  }
 @Override
 @Transactional
 public StreamContent getStreamContent(String language, String name)
     throws ContentNotFoundException {
   StreamContent streamContent = streamContentService.findByLanguageAndName(language, name);
   if (streamContent == null) {
     throw new ContentNotFoundException();
   }
   streamContent.setContent(retrieveStreamContentData(streamContent));
   return streamContent;
 }
  @Override
  @Transactional
  public void addContent(Content content) {
    if (content == null || content.getLanguage() == null || content.getName() == null) {
      throw new IllegalArgumentException("Content or language or name should not be null");
    }

    if (content instanceof StreamContent) {
      streamContentService.createOrUpdate((StreamContent) content);
    } else if (content instanceof StringContent) {
      stringContentService.createOrUpdate((StringContent) content);
    }
  }
 @Override
 @Transactional
 public boolean isStreamContentAvailable(String language, String name) {
   StreamContent streamContent = streamContentService.findByLanguageAndName(language, name);
   return streamContent != null;
 }
 @Override
 @Transactional
 public StreamContent getStreamContent(long streamContentId) {
   return streamContentService.findById(streamContentId);
 }
 @Override
 @Transactional
 public void removeStreamContent(String language, String name) throws ContentNotFoundException {
   streamContentService.delete(getStreamContent(language, name));
 }
 @Override
 @Transactional
 public Byte[] retrieveStreamContentData(StreamContent instance) {
   return (Byte[]) streamContentService.getDetachedField(instance, "content");
 }