package com.ganggarrison.gmdec.files;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import org.lateralgm.components.impl.ResNode;
import org.lateralgm.file.GmFile;
import org.lateralgm.file.ResourceList;
import org.lateralgm.resources.InstantiableResource;
import org.lateralgm.resources.Resource;
import com.ganggarrison.gmdec.ResourceTreeEntry;
import com.ganggarrison.gmdec.ResourceTreeEntry.Type;
import com.ganggarrison.gmdec.dupes.OrderPreservingDupeRemoval;
import com.ganggarrison.gmdec.dupes.ResourceAccessor;
public abstract class ResourceFormat<T extends InstantiableResource<T, ?>> extends FileTreeFormat<T> {
@Override
public void addResToTree(T resource, ResNode parent) {
ResNode child = new ResNode(resource.getName(),
ResNode.STATUS_SECONDARY, resource.getClass(), resource.reference);
parent.add(child);
}
@Override
public void addAllResourcesToGmFile(List<T> resources, GmFile gmf) {
if (resources.isEmpty()) {
return;
}
@SuppressWarnings("unchecked")
Class<T> kind = (Class<T>) resources.get(0).getClass();
checkDuplicateNames(resources, kind);
// Take care of dupes and unassigned IDs
ResourceAccessor<T> accessor = new ResourceAccessor<T>(resources);
OrderPreservingDupeRemoval.perform(accessor);
ResourceList<T> list = (ResourceList<T>) gmf.resMap.getList(kind);
for (T resource : resources) {
list.add(resource);
if (resource.getId() >= list.lastId) {
list.lastId = resource.getId();
}
}
}
@Override
public ResourceTreeEntry createResourceTreeEntry(T resource) {
return new ResourceTreeEntry(resource.getName(), baseFilename(resource), Type.RESOURCE);
};
public static void checkDuplicateNames(Collection<? extends Resource<?, ?>> resources, Class<?> kind) {
HashSet<String> names = new HashSet<String>();
HashSet<String> lcNames = new HashSet<String>();
for (Resource<?, ?> resource : resources) {
String name = resource.getName();
String lcName = name.toLowerCase();
if (names.contains(name)) {
throw new IllegalArgumentException(kind.getSimpleName() + " " + name
+ " has duplicate name!");
}
if (lcNames.contains(lcName)) {
System.err.println("Warning: The name of " + kind.getSimpleName() + " " + name
+ " only differs in case from a different " + kind.getSimpleName() + ".");
}
names.add(name);
lcNames.add(lcName);
}
}
}