Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Abstract interfaces from CompoundTag and ListTag
Release version 1.1.0
- Loading branch information
Showing
5 changed files
with
274 additions
and
240 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
104 changes: 104 additions & 0 deletions
104
src/main/java/net/obnoxint/xnbt/types/AbstractCompoundTag.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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
163
src/main/java/net/obnoxint/xnbt/types/AbstractListTag.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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(); | ||
} | ||
|
||
} |
Oops, something went wrong.