package org.limewire.core.impl.properties;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.limewire.core.api.properties.PropertyDictionary;
import org.limewire.util.NameValue;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
import com.limegroup.gnutella.xml.LimeXMLSchema;
import com.limegroup.gnutella.xml.LimeXMLSchemaRepository;
import com.limegroup.gnutella.xml.SchemaFieldInfo;
@Singleton
class PropertyDictionaryImpl implements PropertyDictionary {
private final Provider<LimeXMLSchemaRepository> schemaRepository;
private List<String> audioGenres;
private List<String> videoGenres;
private List<String> videoRatings;
private List<String> applicationPlatforms;
@Inject
public PropertyDictionaryImpl(Provider<LimeXMLSchemaRepository> schemaRepository) {
this.schemaRepository = schemaRepository;
}
@Override
public List<String> getAudioGenres() {
if (audioGenres == null) {
audioGenres = Collections.unmodifiableList(getValueList("audio", "genre"));
}
return audioGenres;
}
@Override
public List<String> getVideoRatings() {
if (videoRatings == null) {
videoRatings = Collections.unmodifiableList(getValueList("video", "rating"));
}
return videoRatings;
}
@Override
public List<String> getVideoGenres() {
if (videoGenres == null) {
videoGenres = Collections.unmodifiableList(getValueList("video", "type"));
}
return videoGenres;
}
@Override
public List<String> getApplicationPlatforms() {
if (applicationPlatforms == null) {
applicationPlatforms = Collections.unmodifiableList(getValueList("application", "platform"));
}
return applicationPlatforms;
}
private List<String> getValueList(String schemaDescription, String enumerationName) {
List<String> values = new ArrayList<String>();
for (LimeXMLSchema schema : schemaRepository.get().getAvailableSchemas()) {
if (schemaDescription.equals(schema.getDescription())) {
for(SchemaFieldInfo info : schema.getEnumerationFields()) {
String canonicalizedFieldName = info.getCanonicalizedFieldName();
if (canonicalizedFieldName != null && canonicalizedFieldName.endsWith("__" + enumerationName + "__")) {
for(NameValue<String> nameValue : info.getEnumerationList()) {
values.add(nameValue.getName());
}
// Ensure a blank one always exists.
if(!values.contains("")) {
values.add(0, "");
}
}
}
}
}
Collections.sort(values);
return values;
}
}