package openmods.network.rpc; import com.google.common.base.Preconditions; import com.google.common.base.Throwables; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import openmods.datastore.IDataVisitor; public class TargetWrapperRegistry implements IDataVisitor<String, Integer> { private BiMap<Class<? extends IRpcTarget>, Integer> wrapperCls = HashBiMap.create(); @Override public void begin(int size) { wrapperCls.clear(); } @Override public void entry(String clsName, Integer clsId) { Class<?> cls; try { cls = Class.forName(clsName); } catch (ClassNotFoundException e) { throw new IllegalArgumentException(String.format("Failed to load class %s", clsName), e); } Preconditions.checkArgument(IRpcTarget.class.isAssignableFrom(cls), "Class %s is not ITargetWrapper", cls); try { cls.getConstructor(); } catch (NoSuchMethodException e) { throw new IllegalArgumentException(String.format("Class %s has no parameterless constructor", clsName), e); } catch (Exception e) { throw Throwables.propagate(e); } @SuppressWarnings("unchecked") final Class<? extends IRpcTarget> wrapperCls = (Class<? extends IRpcTarget>)cls; this.wrapperCls.put(wrapperCls, clsId); } @Override public void end() {} public int getWrapperId(Class<? extends IRpcTarget> cls) { Integer id = wrapperCls.get(cls); Preconditions.checkNotNull(id, "Wrapper class %s is not registered", cls); return id; } public IRpcTarget createWrapperFromId(int id) { Class<? extends IRpcTarget> cls = wrapperCls.inverse().get(id); Preconditions.checkNotNull(cls, "Can't find class for id %s", id); try { return cls.newInstance(); } catch (Exception e) { throw Throwables.propagate(e); } } }