View Javadoc

1   /***
2    *     Ambient - A music player for the Android platform
3    Copyright (C) 2007 Martin Vysny
4    
5    This program is free software: you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation, either version 3 of the License, or
8    (at your option) any later version.
9    
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU General Public License for more details.
14  
15   You should have received a copy of the GNU General Public License
16   along with this program.  If not, see <http://www.gnu.org/licenses/>.
17   */
18  
19  package sk.baka.ambient.library;
20  
21  import java.util.Collections;
22  import java.util.Enumeration;
23  import java.util.HashSet;
24  import java.util.Iterator;
25  import java.util.Map;
26  import java.util.Set;
27  import java.util.StringTokenizer;
28  
29  /***
30   * Handles genre cache and new genre creation.
31   * 
32   * @author Martin Vysny
33   */
34  public final class GenreCache {
35  	/***
36  	 * The backend.
37  	 */
38  	private final DBStrategy backend;
39  
40  	/***
41  	 * The genre cache.
42  	 */
43  	private final Map<String, Long> genreCache;
44  
45  	/***
46  	 * Creates new genre cache.
47  	 * 
48  	 * @param backend
49  	 *            the backend.
50  	 */
51  	GenreCache(final DBStrategy backend) {
52  		super();
53  		this.backend = backend;
54  		genreCache = backend.getAllGenres();
55  	}
56  
57  	private final Set<Long> genreIds = new HashSet<Long>();
58  	private final Set<Long> readonlyGenreIds = Collections
59  			.unmodifiableSet(genreIds);
60  
61  	/***
62  	 * Registers a genre and returns a list of ids of registered genres.
63  	 * 
64  	 * @param genres
65  	 *            the genre to register, a comma-separated list of genres.
66  	 * @return read-only list of genre database ids.
67  	 */
68  	public Set<Long> register(final String genres) {
69  		genreIds.clear();
70  		for (final String genre : splitGenres(genres)) {
71  			Long genreId = genreCache.get(genre);
72  			if (genreId == null) {
73  				genreId = backend.registerNewGenre(genre);
74  				genreCache.put(genre, genreId);
75  			}
76  			genreIds.add(genreId);
77  		}
78  		return readonlyGenreIds;
79  	}
80  
81  	/***
82  	 * Split given genre list (genres separated by , or ;).
83  	 * 
84  	 * @param genreList
85  	 *            the list to split. If <code>null</code> is given then an
86  	 *            empty iterable is returned.
87  	 * @return tokens. use {@link String#trim()} to get rid of surrounding
88  	 *         whitespaces.
89  	 */
90  	@SuppressWarnings("unchecked")
91  	public static Iterable<String> splitGenres(final String genreList) {
92  		if ((genreList == null) || (genreList.length() == 0)) {
93  			return Collections.EMPTY_LIST;
94  		}
95  		final Enumeration<Object> e = new StringTokenizer(genreList, ",;");
96  		return new Iterable<String>() {
97  			public Iterator<String> iterator() {
98  				return new Iterator<String>() {
99  					public boolean hasNext() {
100 						return e.hasMoreElements();
101 					}
102 
103 					public String next() {
104 						return e.nextElement().toString().trim();
105 					}
106 
107 					public void remove() {
108 						throw new UnsupportedOperationException();
109 					}
110 				};
111 			}
112 		};
113 	}
114 }