package org.limewire.core.impl.library;
import java.io.File;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import org.limewire.core.api.Category;
import org.limewire.core.api.FilePropertyKey;
import org.limewire.core.api.library.LocalFileItem;
import org.limewire.core.impl.InvalidURN;
import org.limewire.core.impl.util.FilePropertyKeyPopulator;
import org.limewire.friend.api.FileMetaData;
import org.limewire.friend.impl.FileMetaDataImpl;
import org.limewire.util.FileUtils;
import org.limewire.util.Objects;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
import com.limegroup.gnutella.CategoryConverter;
import com.limegroup.gnutella.FileDetails;
import com.limegroup.gnutella.URN;
import com.limegroup.gnutella.library.CreationTimeCache;
import com.limegroup.gnutella.library.FileDesc;
import com.limegroup.gnutella.library.IncompleteFileDesc;
import com.limegroup.gnutella.library.LocalFileDetailsFactory;
class CoreLocalFileItem implements LocalFileItem , Comparable {
private final Category category;
private final FileDesc fileDesc;
private final LocalFileDetailsFactory detailsFactory;
private final CreationTimeCache creationTimeCache;
@Inject
public CoreLocalFileItem(@Assisted FileDesc fileDesc, LocalFileDetailsFactory detailsFactory,
CreationTimeCache creationTimeCache) {
this.fileDesc = fileDesc;
this.detailsFactory = detailsFactory;
this.creationTimeCache = creationTimeCache;
this.category = CategoryConverter.categoryForFile(fileDesc.getFile());
}
@Override
public long getCreationTime() {
URN sha1 = fileDesc.getSHA1Urn();
if(sha1 != null) {
return creationTimeCache.getCreationTimeAsLong(sha1);
} else {
return -1;
}
}
@Override
public File getFile() {
return fileDesc.getFile();
}
@Override
public long getLastModifiedTime() {
return fileDesc.lastModified();
}
@Override
public String getName() {
return FileUtils.getFilenameNoExtension(fileDesc.getFileName());
}
@Override
public long getSize() {
return fileDesc.getFileSize();
}
@Override
public int getNumHits() {
return fileDesc.getHitCount();
}
@Override
public int getNumUploads() {
return fileDesc.getCompletedUploads();
}
@Override
public int getNumUploadAttempts() {
return getFileDesc().getAttemptedUploads();
}
@Override
public Category getCategory() {
return category;
}
@Override
public Object getProperty(FilePropertyKey property) {
switch(property) {
case LOCATION:
return getFile().getParent();
case NAME:
return getName();
case DATE_CREATED:
long ct = getCreationTime();
return ct == -1 ? null : ct;
case FILE_SIZE:
return getSize();
default:
return FilePropertyKeyPopulator.get(category, property, fileDesc.getXMLDocument());
}
}
@Override
public String getPropertyString(FilePropertyKey key) {
Object value = getProperty(key);
if (value != null) {
String stringValue = value.toString();
return stringValue;
} else {
return null;
}
}
@Override
public FileMetaData toMetadata() {
FileMetaDataImpl fileMetaData = new FileMetaDataImpl();
fileMetaData.setCreateTime(new Date(getCreationTime()));
fileMetaData.setDescription(""); // TODO
fileMetaData.setId(fileDesc.getSHA1Urn().toString());
fileMetaData.setIndex(fileDesc.getIndex());
fileMetaData.setName(fileDesc.getFileName());
fileMetaData.setSize(fileDesc.getFileSize());
Set<String> urns = new HashSet<String>();
for(URN urn : fileDesc.getUrns()) {
urns.add(urn.toString());
}
fileMetaData.setURNs(urns);
return fileMetaData;
}
public FileDetails getFileDetails() {
return detailsFactory.create(fileDesc);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((getFile() == null) ? 0 : getFile().hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
return getFile().equals(((CoreLocalFileItem) obj).getFile());
}
@Override
public String toString() {
return "CoreLocalFileItem for: " + fileDesc;
}
@Override
public String getFileName() {
return fileDesc.getFileName();
}
@Override
public boolean isShareable() {
return !InvalidURN.instance.equals(getUrn()) && !fileDesc.isStoreFile() && !isIncomplete();
}
@Override
public org.limewire.core.api.URN getUrn() {
URN urn = fileDesc.getSHA1Urn();
if(urn != null) {
return urn;
} else {
return InvalidURN.instance;
}
}
@Override
public boolean isIncomplete() {
return fileDesc instanceof IncompleteFileDesc;
}
public FileDesc getFileDesc() {
return fileDesc;
}
@Override
public int compareTo(Object obj) {
if (getClass() != obj.getClass()) {
return -1;
}
return Objects.compareToNullIgnoreCase(getFileName(), ((CoreLocalFileItem) obj).getFileName(), true);
}
@Override
public boolean isLoaded() {
return !InvalidURN.instance.equals(getUrn());
}
}