Initial commit
This commit is contained in:
@@ -0,0 +1,214 @@
|
||||
package com.thoughtworks.xstream.persistence;
|
||||
|
||||
import com.thoughtworks.xstream.XStream;
|
||||
import com.thoughtworks.xstream.converters.ConverterLookup;
|
||||
import com.thoughtworks.xstream.io.StreamException;
|
||||
import com.thoughtworks.xstream.mapper.Mapper;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.FilenameFilter;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public abstract class AbstractFilePersistenceStrategy implements PersistenceStrategy {
|
||||
private final File baseDirectory;
|
||||
private final String encoding;
|
||||
private final FilenameFilter filter = new ValidFilenameFilter();
|
||||
private final transient XStream xstream;
|
||||
|
||||
protected class ValidFilenameFilter implements FilenameFilter {
|
||||
protected ValidFilenameFilter() {
|
||||
}
|
||||
|
||||
@Override // java.io.FilenameFilter
|
||||
public boolean accept(File file, String str) {
|
||||
return new File(file, str).isFile() && AbstractFilePersistenceStrategy.this.isValid(file, str);
|
||||
}
|
||||
}
|
||||
|
||||
protected class XmlMapEntriesIterator implements Iterator {
|
||||
private final File[] files;
|
||||
private int position = -1;
|
||||
private File current = null;
|
||||
|
||||
protected XmlMapEntriesIterator() {
|
||||
this.files = AbstractFilePersistenceStrategy.this.baseDirectory.listFiles(AbstractFilePersistenceStrategy.this.filter);
|
||||
}
|
||||
|
||||
static /* synthetic */ int access$404(XmlMapEntriesIterator xmlMapEntriesIterator) {
|
||||
int i = xmlMapEntriesIterator.position + 1;
|
||||
xmlMapEntriesIterator.position = i;
|
||||
return i;
|
||||
}
|
||||
|
||||
@Override // java.util.Iterator
|
||||
public boolean hasNext() {
|
||||
return this.position + 1 < this.files.length;
|
||||
}
|
||||
|
||||
@Override // java.util.Iterator
|
||||
public Object next() {
|
||||
return new Map.Entry() { // from class: com.thoughtworks.xstream.persistence.AbstractFilePersistenceStrategy.XmlMapEntriesIterator.1
|
||||
private final File file;
|
||||
private final Object key;
|
||||
|
||||
{
|
||||
XmlMapEntriesIterator xmlMapEntriesIterator = XmlMapEntriesIterator.this;
|
||||
this.file = xmlMapEntriesIterator.current = xmlMapEntriesIterator.files[XmlMapEntriesIterator.access$404(XmlMapEntriesIterator.this)];
|
||||
this.key = AbstractFilePersistenceStrategy.this.extractKey(this.file.getName());
|
||||
}
|
||||
|
||||
@Override // java.util.Map.Entry
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof Map.Entry)) {
|
||||
return false;
|
||||
}
|
||||
Object value = getValue();
|
||||
Map.Entry entry = (Map.Entry) obj;
|
||||
Object key = entry.getKey();
|
||||
Object value2 = entry.getValue();
|
||||
Object obj2 = this.key;
|
||||
if (obj2 == null) {
|
||||
if (key != null) {
|
||||
return false;
|
||||
}
|
||||
} else if (!obj2.equals(key)) {
|
||||
return false;
|
||||
}
|
||||
if (value == null) {
|
||||
if (value2 != null) {
|
||||
return false;
|
||||
}
|
||||
} else if (!getValue().equals(entry.getValue())) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override // java.util.Map.Entry
|
||||
public Object getKey() {
|
||||
return this.key;
|
||||
}
|
||||
|
||||
@Override // java.util.Map.Entry
|
||||
public Object getValue() {
|
||||
return AbstractFilePersistenceStrategy.this.readFile(this.file);
|
||||
}
|
||||
|
||||
@Override // java.util.Map.Entry
|
||||
public Object setValue(Object obj) {
|
||||
return AbstractFilePersistenceStrategy.this.put(this.key, obj);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override // java.util.Iterator
|
||||
public void remove() {
|
||||
File file = this.current;
|
||||
if (file == null) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
file.delete();
|
||||
}
|
||||
}
|
||||
|
||||
public AbstractFilePersistenceStrategy(File file, XStream xStream, String str) {
|
||||
this.baseDirectory = file;
|
||||
this.xstream = xStream;
|
||||
this.encoding = str;
|
||||
}
|
||||
|
||||
private File getFile(String str) {
|
||||
return new File(this.baseDirectory, str);
|
||||
}
|
||||
|
||||
/* JADX INFO: Access modifiers changed from: private */
|
||||
public Object readFile(File file) {
|
||||
try {
|
||||
FileInputStream fileInputStream = new FileInputStream(file);
|
||||
InputStreamReader inputStreamReader = this.encoding != null ? new InputStreamReader(fileInputStream, this.encoding) : new InputStreamReader(fileInputStream);
|
||||
try {
|
||||
return this.xstream.fromXML(inputStreamReader);
|
||||
} finally {
|
||||
inputStreamReader.close();
|
||||
}
|
||||
} catch (FileNotFoundException unused) {
|
||||
return null;
|
||||
} catch (IOException e) {
|
||||
throw new StreamException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private void writeFile(File file, Object obj) {
|
||||
try {
|
||||
FileOutputStream fileOutputStream = new FileOutputStream(file);
|
||||
OutputStreamWriter outputStreamWriter = this.encoding != null ? new OutputStreamWriter(fileOutputStream, this.encoding) : new OutputStreamWriter(fileOutputStream);
|
||||
try {
|
||||
this.xstream.toXML(obj, outputStreamWriter);
|
||||
} finally {
|
||||
outputStreamWriter.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new StreamException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean containsKey(Object obj) {
|
||||
return getFile(getName(obj)).isFile();
|
||||
}
|
||||
|
||||
protected abstract Object extractKey(String str);
|
||||
|
||||
@Override // com.thoughtworks.xstream.persistence.PersistenceStrategy
|
||||
public Object get(Object obj) {
|
||||
return readFile(getFile(getName(obj)));
|
||||
}
|
||||
|
||||
protected ConverterLookup getConverterLookup() {
|
||||
return this.xstream.getConverterLookup();
|
||||
}
|
||||
|
||||
protected Mapper getMapper() {
|
||||
return this.xstream.getMapper();
|
||||
}
|
||||
|
||||
protected abstract String getName(Object obj);
|
||||
|
||||
protected boolean isValid(File file, String str) {
|
||||
return str.endsWith(".xml");
|
||||
}
|
||||
|
||||
@Override // com.thoughtworks.xstream.persistence.PersistenceStrategy
|
||||
public Iterator iterator() {
|
||||
return new XmlMapEntriesIterator();
|
||||
}
|
||||
|
||||
@Override // com.thoughtworks.xstream.persistence.PersistenceStrategy
|
||||
public Object put(Object obj, Object obj2) {
|
||||
Object obj3 = get(obj);
|
||||
writeFile(new File(this.baseDirectory, getName(obj)), obj2);
|
||||
return obj3;
|
||||
}
|
||||
|
||||
@Override // com.thoughtworks.xstream.persistence.PersistenceStrategy
|
||||
public Object remove(Object obj) {
|
||||
File file = getFile(getName(obj));
|
||||
if (!file.isFile()) {
|
||||
return null;
|
||||
}
|
||||
Object readFile = readFile(file);
|
||||
file.delete();
|
||||
return readFile;
|
||||
}
|
||||
|
||||
@Override // com.thoughtworks.xstream.persistence.PersistenceStrategy
|
||||
public int size() {
|
||||
return this.baseDirectory.list(this.filter).length;
|
||||
}
|
||||
}
|
@@ -0,0 +1,104 @@
|
||||
package com.thoughtworks.xstream.persistence;
|
||||
|
||||
import com.thoughtworks.xstream.XStream;
|
||||
import com.thoughtworks.xstream.converters.ConversionException;
|
||||
import com.thoughtworks.xstream.converters.Converter;
|
||||
import com.thoughtworks.xstream.converters.SingleValueConverter;
|
||||
import com.thoughtworks.xstream.io.xml.DomDriver;
|
||||
import java.io.File;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public class FilePersistenceStrategy extends AbstractFilePersistenceStrategy {
|
||||
private final String illegalChars;
|
||||
|
||||
public FilePersistenceStrategy(File file) {
|
||||
this(file, new XStream(new DomDriver()));
|
||||
}
|
||||
|
||||
protected String escape(String str) {
|
||||
StringBuffer stringBuffer = new StringBuffer();
|
||||
for (char c : str.toCharArray()) {
|
||||
if (c < ' ' || this.illegalChars.indexOf(c) >= 0) {
|
||||
StringBuffer stringBuffer2 = new StringBuffer();
|
||||
stringBuffer2.append("%");
|
||||
stringBuffer2.append(Integer.toHexString(c).toUpperCase());
|
||||
stringBuffer.append(stringBuffer2.toString());
|
||||
} else {
|
||||
stringBuffer.append(c);
|
||||
}
|
||||
}
|
||||
return stringBuffer.toString();
|
||||
}
|
||||
|
||||
@Override // com.thoughtworks.xstream.persistence.AbstractFilePersistenceStrategy
|
||||
protected Object extractKey(String str) {
|
||||
String unescape = unescape(str.substring(0, str.length() - 4));
|
||||
if ("null@null".equals(unescape)) {
|
||||
return null;
|
||||
}
|
||||
int indexOf = unescape.indexOf(64);
|
||||
if (indexOf < 0) {
|
||||
ConversionException conversionException = new ConversionException("No valid key");
|
||||
conversionException.add("key", unescape);
|
||||
throw conversionException;
|
||||
}
|
||||
Class realClass = getMapper().realClass(unescape.substring(0, indexOf));
|
||||
Converter lookupConverterForType = getConverterLookup().lookupConverterForType(realClass);
|
||||
if (lookupConverterForType instanceof SingleValueConverter) {
|
||||
return ((SingleValueConverter) lookupConverterForType).fromString(unescape.substring(indexOf + 1));
|
||||
}
|
||||
ConversionException conversionException2 = new ConversionException("No SingleValueConverter available for key type");
|
||||
conversionException2.add("key-type", realClass.getName());
|
||||
throw conversionException2;
|
||||
}
|
||||
|
||||
@Override // com.thoughtworks.xstream.persistence.AbstractFilePersistenceStrategy
|
||||
protected String getName(Object obj) {
|
||||
if (obj == null) {
|
||||
return "null@null.xml";
|
||||
}
|
||||
Class<?> cls = obj.getClass();
|
||||
Converter lookupConverterForType = getConverterLookup().lookupConverterForType(cls);
|
||||
if (!(lookupConverterForType instanceof SingleValueConverter)) {
|
||||
ConversionException conversionException = new ConversionException("No SingleValueConverter available for key type");
|
||||
conversionException.add("key-type", cls.getName());
|
||||
throw conversionException;
|
||||
}
|
||||
StringBuffer stringBuffer = new StringBuffer();
|
||||
stringBuffer.append(getMapper().serializedClass(cls));
|
||||
stringBuffer.append('@');
|
||||
stringBuffer.append(escape(((SingleValueConverter) lookupConverterForType).toString(obj)));
|
||||
stringBuffer.append(".xml");
|
||||
return stringBuffer.toString();
|
||||
}
|
||||
|
||||
@Override // com.thoughtworks.xstream.persistence.AbstractFilePersistenceStrategy
|
||||
protected boolean isValid(File file, String str) {
|
||||
return super.isValid(file, str) && str.indexOf(64) > 0;
|
||||
}
|
||||
|
||||
protected String unescape(String str) {
|
||||
StringBuffer stringBuffer = new StringBuffer();
|
||||
while (true) {
|
||||
int indexOf = str.indexOf(37);
|
||||
if (indexOf < 0) {
|
||||
stringBuffer.append(str);
|
||||
return stringBuffer.toString();
|
||||
}
|
||||
stringBuffer.append(str.substring(0, indexOf));
|
||||
int i = indexOf + 1;
|
||||
int i2 = indexOf + 3;
|
||||
stringBuffer.append((char) Integer.parseInt(str.substring(i, i2), 16));
|
||||
str = str.substring(i2);
|
||||
}
|
||||
}
|
||||
|
||||
public FilePersistenceStrategy(File file, XStream xStream) {
|
||||
this(file, xStream, "utf-8", "<>?:/\\\"|*%");
|
||||
}
|
||||
|
||||
public FilePersistenceStrategy(File file, XStream xStream, String str, String str2) {
|
||||
super(file, xStream, str);
|
||||
this.illegalChars = str2;
|
||||
}
|
||||
}
|
@@ -0,0 +1,78 @@
|
||||
package com.thoughtworks.xstream.persistence;
|
||||
|
||||
import com.thoughtworks.xstream.XStream;
|
||||
import java.io.File;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public class FileStreamStrategy extends AbstractFilePersistenceStrategy implements StreamStrategy {
|
||||
public FileStreamStrategy(File file) {
|
||||
this(file, new XStream());
|
||||
}
|
||||
|
||||
protected String escape(String str) {
|
||||
StringBuffer stringBuffer = new StringBuffer();
|
||||
for (char c : str.toCharArray()) {
|
||||
if (Character.isDigit(c) || ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))) {
|
||||
stringBuffer.append(c);
|
||||
} else if (c == '_') {
|
||||
stringBuffer.append("__");
|
||||
} else {
|
||||
StringBuffer stringBuffer2 = new StringBuffer();
|
||||
stringBuffer2.append("_");
|
||||
stringBuffer2.append(Integer.toHexString(c));
|
||||
stringBuffer2.append("_");
|
||||
stringBuffer.append(stringBuffer2.toString());
|
||||
}
|
||||
}
|
||||
return stringBuffer.toString();
|
||||
}
|
||||
|
||||
@Override // com.thoughtworks.xstream.persistence.AbstractFilePersistenceStrategy
|
||||
protected Object extractKey(String str) {
|
||||
String unescape = unescape(str.substring(0, str.length() - 4));
|
||||
if (unescape.equals("\u0000")) {
|
||||
return null;
|
||||
}
|
||||
return unescape;
|
||||
}
|
||||
|
||||
@Override // com.thoughtworks.xstream.persistence.AbstractFilePersistenceStrategy
|
||||
protected String getName(Object obj) {
|
||||
StringBuffer stringBuffer = new StringBuffer();
|
||||
stringBuffer.append(escape(obj == null ? "\u0000" : obj.toString()));
|
||||
stringBuffer.append(".xml");
|
||||
return stringBuffer.toString();
|
||||
}
|
||||
|
||||
protected String unescape(String str) {
|
||||
StringBuffer stringBuffer = new StringBuffer();
|
||||
char[] charArray = str.toCharArray();
|
||||
int i = 0;
|
||||
int i2 = -1;
|
||||
char c = 65535;
|
||||
while (i < charArray.length) {
|
||||
char c2 = charArray[i];
|
||||
if (c2 == '_' && i2 != -1) {
|
||||
if (c == '_') {
|
||||
stringBuffer.append('_');
|
||||
} else {
|
||||
stringBuffer.append((char) i2);
|
||||
}
|
||||
i2 = -1;
|
||||
} else if (c2 == '_') {
|
||||
i2 = 0;
|
||||
} else if (i2 != -1) {
|
||||
i2 = (i2 * 16) + Integer.parseInt(String.valueOf(c2), 16);
|
||||
} else {
|
||||
stringBuffer.append(c2);
|
||||
}
|
||||
i++;
|
||||
c = c2;
|
||||
}
|
||||
return stringBuffer.toString();
|
||||
}
|
||||
|
||||
public FileStreamStrategy(File file, XStream xStream) {
|
||||
super(file, xStream, null);
|
||||
}
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package com.thoughtworks.xstream.persistence;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public interface PersistenceStrategy {
|
||||
Object get(Object obj);
|
||||
|
||||
Iterator iterator();
|
||||
|
||||
Object put(Object obj, Object obj2);
|
||||
|
||||
Object remove(Object obj);
|
||||
|
||||
int size();
|
||||
}
|
@@ -0,0 +1,5 @@
|
||||
package com.thoughtworks.xstream.persistence;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public interface StreamStrategy extends PersistenceStrategy {
|
||||
}
|
@@ -0,0 +1,80 @@
|
||||
package com.thoughtworks.xstream.persistence;
|
||||
|
||||
import java.util.AbstractList;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public class XmlArrayList extends AbstractList {
|
||||
private final XmlMap map;
|
||||
|
||||
public XmlArrayList(PersistenceStrategy persistenceStrategy) {
|
||||
this.map = new XmlMap(persistenceStrategy);
|
||||
}
|
||||
|
||||
private void rangeCheck(int i) {
|
||||
int size = size();
|
||||
if (i >= size || i < 0) {
|
||||
StringBuffer stringBuffer = new StringBuffer();
|
||||
stringBuffer.append("Index: ");
|
||||
stringBuffer.append(i);
|
||||
stringBuffer.append(", Size: ");
|
||||
stringBuffer.append(size);
|
||||
throw new IndexOutOfBoundsException(stringBuffer.toString());
|
||||
}
|
||||
}
|
||||
|
||||
@Override // java.util.AbstractList, java.util.List
|
||||
public void add(int i, Object obj) {
|
||||
int size = size();
|
||||
if (i >= size + 1 || i < 0) {
|
||||
StringBuffer stringBuffer = new StringBuffer();
|
||||
stringBuffer.append("Index: ");
|
||||
stringBuffer.append(i);
|
||||
stringBuffer.append(", Size: ");
|
||||
stringBuffer.append(size);
|
||||
throw new IndexOutOfBoundsException(stringBuffer.toString());
|
||||
}
|
||||
int i2 = i != size ? i - 1 : i;
|
||||
while (size > i2) {
|
||||
this.map.put(new Integer(size + 1), this.map.get(new Integer(size)));
|
||||
size--;
|
||||
}
|
||||
this.map.put(new Integer(i), obj);
|
||||
}
|
||||
|
||||
@Override // java.util.AbstractList, java.util.List
|
||||
public Object get(int i) {
|
||||
rangeCheck(i);
|
||||
return this.map.get(new Integer(i));
|
||||
}
|
||||
|
||||
@Override // java.util.AbstractList, java.util.List
|
||||
public Object remove(int i) {
|
||||
int size = size();
|
||||
rangeCheck(i);
|
||||
Object obj = this.map.get(new Integer(i));
|
||||
while (true) {
|
||||
int i2 = size - 1;
|
||||
if (i >= i2) {
|
||||
this.map.remove(new Integer(i2));
|
||||
return obj;
|
||||
}
|
||||
XmlMap xmlMap = this.map;
|
||||
Integer num = new Integer(i);
|
||||
i++;
|
||||
xmlMap.put(num, this.map.get(new Integer(i)));
|
||||
}
|
||||
}
|
||||
|
||||
@Override // java.util.AbstractList, java.util.List
|
||||
public Object set(int i, Object obj) {
|
||||
rangeCheck(i);
|
||||
Object obj2 = get(i);
|
||||
this.map.put(new Integer(i), obj);
|
||||
return obj2;
|
||||
}
|
||||
|
||||
@Override // java.util.AbstractCollection, java.util.Collection, java.util.List
|
||||
public int size() {
|
||||
return this.map.size();
|
||||
}
|
||||
}
|
60
sources/com/thoughtworks/xstream/persistence/XmlMap.java
Normal file
60
sources/com/thoughtworks/xstream/persistence/XmlMap.java
Normal file
@@ -0,0 +1,60 @@
|
||||
package com.thoughtworks.xstream.persistence;
|
||||
|
||||
import java.util.AbstractMap;
|
||||
import java.util.AbstractSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public class XmlMap extends AbstractMap {
|
||||
private final PersistenceStrategy persistenceStrategy;
|
||||
|
||||
class XmlMapEntries extends AbstractSet {
|
||||
XmlMapEntries() {
|
||||
}
|
||||
|
||||
@Override // java.util.AbstractCollection, java.util.Collection, java.util.Set
|
||||
public boolean isEmpty() {
|
||||
return XmlMap.this.isEmpty();
|
||||
}
|
||||
|
||||
@Override // java.util.AbstractCollection, java.util.Collection, java.lang.Iterable, java.util.Set
|
||||
public Iterator iterator() {
|
||||
return XmlMap.this.persistenceStrategy.iterator();
|
||||
}
|
||||
|
||||
@Override // java.util.AbstractCollection, java.util.Collection, java.util.Set
|
||||
public int size() {
|
||||
return XmlMap.this.size();
|
||||
}
|
||||
}
|
||||
|
||||
public XmlMap(PersistenceStrategy persistenceStrategy) {
|
||||
this.persistenceStrategy = persistenceStrategy;
|
||||
}
|
||||
|
||||
@Override // java.util.AbstractMap, java.util.Map
|
||||
public Set entrySet() {
|
||||
return new XmlMapEntries();
|
||||
}
|
||||
|
||||
@Override // java.util.AbstractMap, java.util.Map
|
||||
public Object get(Object obj) {
|
||||
return this.persistenceStrategy.get(obj);
|
||||
}
|
||||
|
||||
@Override // java.util.AbstractMap, java.util.Map
|
||||
public Object put(Object obj, Object obj2) {
|
||||
return this.persistenceStrategy.put(obj, obj2);
|
||||
}
|
||||
|
||||
@Override // java.util.AbstractMap, java.util.Map
|
||||
public Object remove(Object obj) {
|
||||
return this.persistenceStrategy.remove(obj);
|
||||
}
|
||||
|
||||
@Override // java.util.AbstractMap, java.util.Map
|
||||
public int size() {
|
||||
return this.persistenceStrategy.size();
|
||||
}
|
||||
}
|
40
sources/com/thoughtworks/xstream/persistence/XmlSet.java
Normal file
40
sources/com/thoughtworks/xstream/persistence/XmlSet.java
Normal file
@@ -0,0 +1,40 @@
|
||||
package com.thoughtworks.xstream.persistence;
|
||||
|
||||
import java.util.AbstractSet;
|
||||
import java.util.Iterator;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public class XmlSet extends AbstractSet {
|
||||
private final XmlMap map;
|
||||
|
||||
public XmlSet(PersistenceStrategy persistenceStrategy) {
|
||||
this.map = new XmlMap(persistenceStrategy);
|
||||
}
|
||||
|
||||
private Long findEmptyKey() {
|
||||
long currentTimeMillis = System.currentTimeMillis();
|
||||
while (this.map.containsKey(new Long(currentTimeMillis))) {
|
||||
currentTimeMillis++;
|
||||
}
|
||||
return new Long(currentTimeMillis);
|
||||
}
|
||||
|
||||
@Override // java.util.AbstractCollection, java.util.Collection, java.util.Set
|
||||
public boolean add(Object obj) {
|
||||
if (this.map.containsValue(obj)) {
|
||||
return false;
|
||||
}
|
||||
this.map.put(findEmptyKey(), obj);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override // java.util.AbstractCollection, java.util.Collection, java.lang.Iterable, java.util.Set
|
||||
public Iterator iterator() {
|
||||
return this.map.values().iterator();
|
||||
}
|
||||
|
||||
@Override // java.util.AbstractCollection, java.util.Collection, java.util.Set
|
||||
public int size() {
|
||||
return this.map.size();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user