package org.sculptor.examples.library.media.repositoryimpl; import static org.sculptor.examples.library.media.domain.MediaProperties.title; import static org.sculptor.framework.accessapi.ConditionalCriteriaBuilder.criteriaFor; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.sculptor.examples.library.media.domain.Media; import org.sculptor.examples.library.media.domain.MediaCharacter; import org.sculptor.examples.library.media.domain.MediaCharacterProperties; import org.sculptor.examples.library.media.domain.Movie; import org.sculptor.examples.library.media.domain.MovieProperties; import org.springframework.stereotype.Repository; /** * Repository implementation for Media */ @Repository("mediaRepository") public class MediaRepositoryImpl extends MediaRepositoryBase { public MediaRepositoryImpl() { } @Override public Media save(Media entity) { if (entity.getId() == null && entity.isMediaCharactersLoaded()) { List<MediaCharacter> mediaCharacters = new ArrayList<MediaCharacter>(entity.getMediaCharacters()); entity.removeAllMediaCharacters(); Media saved = super.save(entity); for (MediaCharacter each : mediaCharacters) { saved.addMediaCharacter(each); getMediaCharacterRepository().save(each); } return super.save(entity); } else { if (entity.isMediaCharactersLoaded()) { for (MediaCharacter each : entity.getMediaCharacters()) { getMediaCharacterRepository().save(each); } } return super.save(entity); } } @Override public java.util.List<Media> findMediaByName(String libraryId, String name) { List<Media> potentialResult = findByCondition(criteriaFor(Media.class).withProperty(title()).eq(name).build()); List<Media> result = new ArrayList<Media>(); for (Media each : potentialResult) { if (each.existsInLibrary(libraryId)) { result.add(each); } } return result; } @Override public Map<String, Movie> findMovieByUrlIMDB(Set<String> keys) { Map<Object, Media> media = findByKeys(keys, MovieProperties.urlIMDB().toString(), Movie.class); Map<String, Movie> movies = new HashMap<String, Movie>(); for (Object k : media.keySet()) { movies.put((String) k, (Movie) media.get(k)); } return movies; } @Override public List<Media> findMediaByCharacter(String libraryId, String characterName) { // Retrieve the MediaCharacter objects via another Repository List<MediaCharacter> foundCharacters = getMediaCharacterRepository().findByCondition( criteriaFor(MediaCharacter.class).withProperty(MediaCharacterProperties.name()).eq(characterName) .build()); // filter matching Media for the found characters and the specified // library List<Media> matchingMedia = new ArrayList<Media>(); for (MediaCharacter c : foundCharacters) { for (Media m : c.getExistsInMedia()) { if (m.existsInLibrary(libraryId)) { matchingMedia.add(m); } } } return matchingMedia; } @Override public int getNumberOfMovies(String libraryId) { int count = 0; List<Media> all = findAll(); for (Media each : all) { if (each instanceof Movie && each.existsInLibrary(libraryId)) { count++; } } return count; } }