com.planetj.taste.impl.model.file
Class FileDataModel

java.lang.Object
  extended by com.planetj.taste.impl.model.file.FileDataModel
All Implemented Interfaces:
Refreshable, DataModel

public class FileDataModel
extends java.lang.Object
implements DataModel

A DataModel backed by a comma-delimited file. This class assumes that each line of the file contains a user ID, followed by item ID, followed by preferences value, separated by commas. The preference value is assumed to be parseable as a double. The user and item IDs are ready literally as Strings and treated as such in the API. Note that this means that whitespace matters in the data file; they will be treated as part of the ID values.

This class is not intended for use with very large amounts of data (over, say, a million rows). For that, MySQLJDBCDataModel and a database are more appropriate. The file will be periodically reloaded if a change is detected.

Author:
Sean Owen

Constructor Summary
FileDataModel(java.io.File dataFile)
           
 
Method Summary
protected  Item buildItem(java.lang.String id)
          Subclasses may override to return a different Item implementation.
protected  Preference buildPreference(User user, Item item, double value)
          Subclasses may override to return a different Preference implementation.
protected  User buildUser(java.lang.String id, java.util.List<Preference> prefs)
          Subclasses may override to return a different User implementation.
 Item getItem(java.lang.Object id)
          
 java.lang.Iterable<? extends Item> getItems()
          
 int getNumItems()
          
 int getNumUsers()
          
 java.lang.Iterable<? extends Preference> getPreferencesForItem(java.lang.Object itemID)
          
 Preference[] getPreferencesForItemAsArray(java.lang.Object itemID)
          
 User getUser(java.lang.Object id)
          
 java.lang.Iterable<? extends User> getUsers()
          
 void refresh()
          

Triggers "refresh" -- whatever that means -- of the implementation.

protected  void reload()
           
 void removePreference(java.lang.Object userID, java.lang.Object itemID)
          Removes a particular preference for a user.
 void setPreference(java.lang.Object userID, java.lang.Object itemID, double value)
          Sets a particular preference (item plus rating) for a user.
 java.lang.String toString()
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

FileDataModel

public FileDataModel(java.io.File dataFile)
              throws java.io.FileNotFoundException
Parameters:
dataFile - file containing preferences data
Throws:
java.io.FileNotFoundException - if dataFile does not exist
Method Detail

reload

protected void reload()
               throws java.io.IOException
Throws:
java.io.IOException

getUsers

@NotNull
public java.lang.Iterable<? extends User> getUsers()
                                            throws TasteException

Specified by:
getUsers in interface DataModel
Returns:
a List of all Users in the model, ordered by User
Throws:
TasteException - if an error occurs while accessing the data

getUser

@NotNull
public User getUser(java.lang.Object id)
             throws TasteException

Specified by:
getUser in interface DataModel
Parameters:
id - user ID
Returns:
User who has that ID
Throws:
java.util.NoSuchElementException - if there is no such user
TasteException - if an error occurs while accessing the data

getItems

@NotNull
public java.lang.Iterable<? extends Item> getItems()
                                            throws TasteException

Specified by:
getItems in interface DataModel
Returns:
a List of all Items in the model, order by Item
Throws:
TasteException - if an error occurs while accessing the data

getItem

@NotNull
public Item getItem(java.lang.Object id)
             throws TasteException

Specified by:
getItem in interface DataModel
Parameters:
id - item ID
Returns:
Item that has that ID
Throws:
TasteException - if an error occurs while accessing the data

getPreferencesForItem

@NotNull
public java.lang.Iterable<? extends Preference> getPreferencesForItem(java.lang.Object itemID)
                                                               throws TasteException

Specified by:
getPreferencesForItem in interface DataModel
Parameters:
itemID - item ID
Returns:
all existing Preferences expressed for that item, ordered by User
Throws:
TasteException - if an error occurs while accessing the data

getPreferencesForItemAsArray

@NotNull
public Preference[] getPreferencesForItemAsArray(java.lang.Object itemID)
                                          throws TasteException

Specified by:
getPreferencesForItemAsArray in interface DataModel
Parameters:
itemID - item ID
Returns:
all existing Preferences expressed for that item, ordered by User, as an array
Throws:
TasteException - if an error occurs while accessing the data

getNumItems

public int getNumItems()
                throws TasteException

Specified by:
getNumItems in interface DataModel
Returns:
total number of Items known to the model. This is generally the union of all Items preferred by at least one User but could include more.
Throws:
TasteException - if an error occurs while accessing the data

getNumUsers

public int getNumUsers()
                throws TasteException

Specified by:
getNumUsers in interface DataModel
Returns:
total number of Users known to the model.
Throws:
TasteException - if an error occurs while accessing the data

setPreference

public void setPreference(java.lang.Object userID,
                          java.lang.Object itemID,
                          double value)
Description copied from interface: DataModel

Sets a particular preference (item plus rating) for a user.

Specified by:
setPreference in interface DataModel
Parameters:
userID - user to set preference for
itemID - item to set preference for
value - preference value
Throws:
java.lang.UnsupportedOperationException

removePreference

public void removePreference(java.lang.Object userID,
                             java.lang.Object itemID)
Description copied from interface: DataModel

Removes a particular preference for a user.

Specified by:
removePreference in interface DataModel
Parameters:
userID - user from which to remove preference
itemID - item to remove preference for
Throws:
java.lang.UnsupportedOperationException

refresh

public void refresh()

Triggers "refresh" -- whatever that means -- of the implementation. The general contract is that any Refreshable should always leave itself in a consistent, operational state, and that the refresh atomically updates internal state from old to new.

Specified by:
refresh in interface Refreshable

buildUser

@NotNull
protected User buildUser(java.lang.String id,
                                 java.util.List<Preference> prefs)
Subclasses may override to return a different User implementation.

Parameters:
id - user ID
prefs - user preferences
Returns:
GenericUser by default

buildItem

@NotNull
protected Item buildItem(java.lang.String id)
Subclasses may override to return a different Item implementation.

Parameters:
id - item ID
Returns:
GenericItem by default

buildPreference

@NotNull
protected Preference buildPreference(User user,
                                             Item item,
                                             double value)
Subclasses may override to return a different Preference implementation.

Parameters:
user - User who expresses the preference
item - preferred Item
value - preference value
Returns:
GenericPreference by default

toString

@NotNull
public java.lang.String toString()
Overrides:
toString in class java.lang.Object