package org.skyscreamer.yoga.demo.dao.inmemory; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Collection; import java.util.Map; import org.skyscreamer.yoga.demo.model.Album; import org.skyscreamer.yoga.demo.model.Artist; import org.skyscreamer.yoga.demo.model.Song; import org.skyscreamer.yoga.demo.model.User; import com.google.common.collect.Maps; public class DemoData { private Map<Long, User> users = Maps.newHashMap(); private Map<Long, Artist> artists = Maps.newHashMap(); private Map<Long, Album> albums = Maps.newHashMap(); private Map<Long, Song> songs = Maps.newHashMap(); public static final String remoteData = "https://raw.github.com/skyscreamer/skyscreamer.github.com/master/yoga/loaddb.sql.gz"; public static final String localData = "sampledb.sql"; public void init() { try { init( Thread.currentThread().getContextClassLoader().getResourceAsStream( "sampledb.sql" ) ); } catch ( Exception e ) { throw new RuntimeException( e ); } // this doesn't seem to work yet. It reads a partial line and throws up // try // { // init( new GZIPInputStream( new URL( remoteData ).openStream() ) ); // } // catch ( Exception e ) // { // e.printStackTrace(); // } } private void init( InputStream is ) throws IOException { BufferedReader reader = new BufferedReader( new InputStreamReader( is ) ); String line = null; while ( ( line = reader.readLine() ) != null ) { String type = line.replaceFirst( "INSERT INTO ([^(]+).*", "$1" ); String[] values = line.replaceFirst( ".*VALUES\\((.*)\\)", "$1" ).split( ", " ); if ("User".equalsIgnoreCase( type )) { newUser( toLong( values[ 0 ] ), toStr( values[ 1 ] ) ); } else if ("Friend".equalsIgnoreCase( type )) { newFriend( toLong( values[ 0 ] ), toLong( values[ 1 ] ) ); } else if ("Artist".equalsIgnoreCase( type )) { newArtist( toLong( values[ 0 ] ), toStr( values[ 1 ] ) ); } else if ("Fan".equalsIgnoreCase( type )) { newFan( toLong( values[ 0 ] ), toLong( values[ 1 ] ) ); } else if ("Album".equalsIgnoreCase( type )) { newAlbum( toLong( values[ 0 ] ), toStr( values[ 1 ] ), toLong( values[ 2 ] ), new Integer( values[ 3 ].trim() ) ); } else if ("Song".equalsIgnoreCase( type )) { newSong( toLong( values[ 0 ] ), toStr( values[ 1 ] ), toLong( values[ 2 ] ), toLong( values[ 3 ] ) ); } } is.close(); } private long toLong( String string ) { return Long.parseLong( string.trim() ); } private String toStr( String string ) { return string.trim().replaceFirst( "^'", "" ).replaceFirst( "'$", "" ); } private void newUser( long id, String name ) { User user = new User(); user.setName( name ); user.setId( id ); users.put( id, user ); } private void newFriend( long from, long to ) { users.get( from ).getFriends().add( users.get( to ) ); } private void newArtist( long id, String name ) { Artist artist = new Artist(); artist.setId( id ); artist.setName( name ); artists.put( id, artist ); } private void newFan( long userId, long artistId ) { Artist artist = artists.get( artistId ); User user = users.get( userId ); user.getFavoriteArtists().add( artist ); artist.getFans().add( user ); } private void newAlbum( long id, String title, long artistId, int year ) { Album album = new Album(); album.setId( id ); album.setTitle( title ); Artist artist = artists.get( artistId ); album.setArtist( artist ); album.setYear( year ); albums.put( id, album ); artist.getAlbums().add( album ); } private void newSong( long id, String title, long artistId, long albumId ) { Song song = new Song(); song.setId( id ); song.setTitle( title ); song.setArtist( artists.get( artistId ) ); Album album = albums.get( albumId ); song.setAlbum( album ); album.getSongs().add( song ); songs.put( id, song ); } @SuppressWarnings( "unchecked" ) protected <T> Map<Long, T> getMap( Class<T> type ) { if (type == User.class) return ( Map<Long, T> ) users; if (type == Album.class) return ( Map<Long, T> ) albums; if (type == Song.class) return ( Map<Long, T> ) songs; if (type == Artist.class) return ( Map<Long, T> ) artists; else throw new IllegalArgumentException( "you cannot get a map for type: " + type.getName() ); } public <T> T get( Class<T> type, long id ) { return getMap( type ).get( id ); } public <T> Collection<T> getAll( Class<T> type ) { return getMap( type ).values(); } }