Skip to content

Commit

Permalink
Abstract interfaces from CompoundTag and ListTag
Browse files Browse the repository at this point in the history
Release version 1.1.0
  • Loading branch information
obnoxint committed Nov 29, 2015
1 parent bc51935 commit 52250ac
Show file tree
Hide file tree
Showing 5 changed files with 274 additions and 240 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Expand Up @@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>net.obnoxint</groupId>
<artifactId>xnbt</artifactId>
<version>1.0.0</version>
<version>1.1.0</version>
<name>XNBT</name>

<build>
Expand Down
104 changes: 104 additions & 0 deletions src/main/java/net/obnoxint/xnbt/types/AbstractCompoundTag.java
@@ -0,0 +1,104 @@
package net.obnoxint.xnbt.types;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import net.obnoxint.xnbt.BaseTag;
import net.obnoxint.xnbt.NBTTag;
import net.obnoxint.xnbt.NBTTagHeader;

public abstract class AbstractCompoundTag extends BaseTag implements Map<String, NBTTag> {

private static Map<String, NBTTag> sanitizePayload(final Map<String, NBTTag> payload) {
if (payload == null) {
return new HashMap<>();
}

if (payload.containsKey(null) || payload.containsValue(null)) {
throw new NullPointerException("payload must not contain null keys or values");
}

return new HashMap<>(payload);
}

protected AbstractCompoundTag(final String name, final Map<String, NBTTag> payload) {
super(new NBTTagHeader(BaseType.COMPOUND.Id(), name), sanitizePayload(payload));
}

@Override
public void clear() {
getPayload().clear();
}

@Override
public boolean containsKey(final Object key) {
return getPayload().containsKey(key);
}

@Override
public boolean containsValue(final Object value) {
return getPayload().containsValue(value);
}

@Override
public Set<java.util.Map.Entry<String, NBTTag>> entrySet() {
return getPayload().entrySet();
}

@Override
public NBTTag get(final Object key) {
return getPayload().get(key);
}

@SuppressWarnings("unchecked")
@Override
public Map<String, NBTTag> getPayload() {
return ((Map<String, NBTTag>) super.getPayload());
}

@Override
public boolean isEmpty() {
return getPayload().isEmpty();
}

@Override
public Set<String> keySet() {
return getPayload().keySet();
}

public abstract NBTTag put(NBTTag tag);

@Override
public final NBTTag put(final String key, final NBTTag value) throws UnsupportedOperationException {
throw new UnsupportedOperationException();
}

public abstract void putAll(Collection<? extends NBTTag> tags);

@Override
public void putAll(final Map<? extends String, ? extends NBTTag> m) {
putAll(m.values());
}

@Override
public NBTTag remove(final Object key) {
return getPayload().remove(key);
}

public void setPayload(final Map<String, NBTTag> payload) {
super.setPayload(sanitizePayload(payload));
}

@Override
public int size() {
return getPayload().size();
}

@Override
public Collection<NBTTag> values() {
return getPayload().values();
}

}
163 changes: 163 additions & 0 deletions src/main/java/net/obnoxint/xnbt/types/AbstractListTag.java
@@ -0,0 +1,163 @@
package net.obnoxint.xnbt.types;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

import net.obnoxint.xnbt.BaseTag;
import net.obnoxint.xnbt.NBTTag;
import net.obnoxint.xnbt.NBTTagHeader;

public abstract class AbstractListTag extends BaseTag implements List<NBTTag> {

private static List<NBTTag> sanitizePayload(final List<NBTTag> payload) {

if (payload == null) {
return new ArrayList<>();
}

byte t = -1;

for (final NBTTag e : payload) {

if (e == null) {
throw new NullPointerException("payload must not contain null elements");
}

if (t == -1) {
t = e.getHeader().getType();
if (t == BaseType.END.Id()) {
throw new IllegalArgumentException("ListTag must not contain EndTags");
}
} else if (t != e.getHeader().getType()) {
throw new IllegalArgumentException("NBTTag of type " + e.getHeader().getType()
+ " can't be added to ListTag because it already contains one or more elements of type " + t);
}

}

return payload;
}

protected AbstractListTag(final String name, final List<NBTTag> payload) {
super(new NBTTagHeader(BaseType.LIST.Id(), name), sanitizePayload(payload));
}

@Override
public final void add(final int index, final NBTTag element) throws UnsupportedOperationException {
throw new UnsupportedOperationException();
}

@Override
public final boolean addAll(final int index, final Collection<? extends NBTTag> c) throws UnsupportedOperationException {
throw new UnsupportedOperationException();
}

@Override
public void clear() {
getPayload().clear();
}

@Override
public boolean contains(final Object o) {
return getPayload().contains(o);
}

@Override
public boolean containsAll(final Collection<?> c) {
return getPayload().containsAll(c);
}

@Override
public NBTTag get(final int index) {
return getPayload().get(index);
}

@SuppressWarnings("unchecked")
@Override
public List<NBTTag> getPayload() {
return (List<NBTTag>) super.getPayload();
}

@Override
public int indexOf(final Object o) {
return getPayload().indexOf(o);
}

@Override
public boolean isEmpty() {
return getPayload().isEmpty();
}

@Override
public Iterator<NBTTag> iterator() {
return getPayload().iterator();
}

@Override
public int lastIndexOf(final Object o) {
return getPayload().lastIndexOf(o);
}

@Override
public ListIterator<NBTTag> listIterator() {
return getPayload().listIterator();
}

@Override
public ListIterator<NBTTag> listIterator(final int index) {
return getPayload().listIterator(index);
}

@Override
public NBTTag remove(final int index) {
return getPayload().remove(index);
}

@Override
public boolean remove(final Object o) {
return getPayload().remove(o);
}

@Override
public boolean removeAll(final Collection<?> c) {
return getPayload().removeAll(c);
}

@Override
public boolean retainAll(final Collection<?> c) {
return getPayload().retainAll(c);
}

@Override
public final NBTTag set(final int index, final NBTTag element) throws UnsupportedOperationException {
throw new UnsupportedOperationException();
}

public void setPayload(final List<NBTTag> payload) {
super.setPayload(payload == null ? new ArrayList<>() : sanitizePayload(payload));
}

@Override
public int size() {
return getPayload().size();
}

@Override
public List<NBTTag> subList(final int fromIndex, final int toIndex) {
return getPayload().subList(fromIndex, toIndex);
}

@Override
public Object[] toArray() {
return getPayload().toArray();
}

@Override
public <T> T[] toArray(final T[] a) {
return getPayload().toArray(a);
}

}
90 changes: 3 additions & 87 deletions src/main/java/net/obnoxint/xnbt/types/CompoundTag.java
@@ -1,113 +1,29 @@
package net.obnoxint.xnbt.types;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import net.obnoxint.xnbt.BaseTag;
import net.obnoxint.xnbt.NBTTag;
import net.obnoxint.xnbt.NBTTagHeader;

@SuppressWarnings("unchecked")
public class CompoundTag extends BaseTag implements Map<String, NBTTag> {

private static Map<String, NBTTag> sanitizePayload(final Map<String, NBTTag> payload) {
if (payload == null) {
return new HashMap<>();
}

if (payload.containsKey(null) || payload.containsValue(null)) {
throw new NullPointerException();
}

return new HashMap<>(payload);
}
public class CompoundTag extends AbstractCompoundTag {

public CompoundTag(final String name, final Map<String, NBTTag> payload) {
super(new NBTTagHeader(BaseType.COMPOUND.Id(), name), sanitizePayload(payload));
}

@Override
public void clear() {
((Map<String, NBTTag>) super.getPayload()).clear();
}

@Override
public boolean containsKey(final Object key) {
return ((Map<String, NBTTag>) super.getPayload()).containsKey(key);
}

@Override
public boolean containsValue(final Object value) {
return ((Map<String, NBTTag>) super.getPayload()).containsValue(value);
}

@Override
public Set<java.util.Map.Entry<String, NBTTag>> entrySet() {
return ((Map<String, NBTTag>) super.getPayload()).entrySet();
}

@Override
public NBTTag get(final Object key) {
return ((Map<String, NBTTag>) super.getPayload()).get(key);
}

@Override
public Map<String, NBTTag> getPayload() {
return new HashMap<>((Map<String, NBTTag>) super.getPayload());
}

@Override
public boolean isEmpty() {
return ((Map<String, NBTTag>) super.getPayload()).isEmpty();
super(name, payload);
}

@Override
public Set<String> keySet() {
return ((Map<String, NBTTag>) super.getPayload()).keySet();
}

public NBTTag put(final NBTTag value) {
if (value == null) {
throw new NullPointerException();
}
return ((Map<String, NBTTag>) super.getPayload()).put(value.getHeader().getName(), value);
return getPayload().put(value.getHeader().getName(), value);
}

@Override
public NBTTag put(final String key, final NBTTag value) throws UnsupportedOperationException {
throw new UnsupportedOperationException();
}

public void putAll(final Collection<? extends NBTTag> tags) {
for (final NBTTag tag : tags) {
put(tag);
}
}

@Override
public void putAll(final Map<? extends String, ? extends NBTTag> m) {
putAll(m.values());
}

@Override
public NBTTag remove(final Object key) {
return ((Map<String, NBTTag>) super.getPayload()).remove(key);
}

public void setPayload(final Map<String, NBTTag> payload) {
super.setPayload(sanitizePayload(payload));
}

@Override
public int size() {
return ((Map<String, NBTTag>) super.getPayload()).size();
}

@Override
public Collection<NBTTag> values() {
return ((Map<String, NBTTag>) super.getPayload()).values();
}

}

0 comments on commit 52250ac

Please sign in to comment.