package org.grouplens.mooc.cbf.dao; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import it.unimi.dsi.fastutil.longs.LongSet; import it.unimi.dsi.fastutil.longs.LongSets; import org.grouplens.lenskit.cursors.Cursor; import org.grouplens.lenskit.data.dao.DataAccessException; import org.grouplens.lenskit.util.DelimitedTextCursor; import javax.inject.Inject; import java.io.File; import java.io.FileNotFoundException; /** * @author <a href="http://www.grouplens.org">GroupLens Research</a> */ public class MOOCItemDAO implements ItemTitleDAO { private final File titleFile; private transient volatile Long2ObjectMap<String> titleCache; @Inject public MOOCItemDAO(@TitleFile File file) { titleFile = file; } private void ensureTitleCache() { if (titleCache == null) { synchronized (this) { if (titleCache == null) { titleCache = loadTitleCache(); } } } } private Long2ObjectMap<String> loadTitleCache() { Long2ObjectMap<String> cache = new Long2ObjectOpenHashMap<String>(); Cursor<String[]> lines = null; try { lines = new DelimitedTextCursor(titleFile, ","); } catch (FileNotFoundException e) { throw new DataAccessException("cannot open file", e); } try { for (String[] line: lines) { long mid = Long.parseLong(line[0]); cache.put(mid, line[1]); } } finally { lines.close(); } return cache; } @Override public LongSet getItemIds() { ensureTitleCache(); return LongSets.unmodifiable(titleCache.keySet()); } @Override public String getItemTitle(long item) { return titleCache.get(item); } }