@Override public DataView createView(DataQuery path) { checkNotNull(path, "path"); List<String> queryParts = path.getParts(); int sz = queryParts.size(); checkArgument(sz != 0, "The size of the query must be at least 1"); String key = queryParts.get(0); DataQuery keyQuery = of(key); if (sz == 1) { DataView result = new MemoryDataView(this, keyQuery, this.safety); this.map.put(key, result); return result; } DataQuery subQuery = path.popFirst(); DataView subView = (DataView) this.map.get(key); if (subView == null) { subView = new MemoryDataView(this.parent, keyQuery, this.safety); this.map.put(key, subView); } return subView.createView(subQuery); }
@Override public boolean contains(DataQuery path, DataQuery... paths) { checkNotNull(path, "DataQuery cannot be null!"); checkNotNull(paths, "DataQuery varargs cannot be null!"); if (paths.length == 0) { return contains(path); } List<DataQuery> queries = new ArrayList<>(); queries.add(path); for (DataQuery query : paths) { queries.add(checkNotNull(query, "No null queries!")); } for (DataQuery query : queries) { if (!contains(query)) { return false; } } return true; }
@Override public DataView createView(DataQuery path, Map<?, ?> map) { checkNotNull(path, "path"); DataView section = createView(path); for (Map.Entry<?, ?> entry : map.entrySet()) { if (entry.getValue() instanceof Map) { section.createView(of('.', entry.getKey().toString()), (Map<?, ?>) entry.getValue()); } else { section.set(of('.', entry.getKey().toString()), entry.getValue()); } } return section; }
@Override public Map<DataQuery, Object> getValues(boolean deep) { ImmutableMap.Builder<DataQuery, Object> builder = ImmutableMap.builder(); for (DataQuery query : getKeys(deep)) { Object value = get(query).get(); if (value instanceof DataView) { builder.put(query, ((DataView) value).getValues(deep)); } else { builder.put(query, get(query).get()); } } return builder.build(); }
@Override public Optional<? extends Map<?, ?>> getMap(DataQuery path) { Optional<Object> val = get(path); if (val.isPresent()) { if (val.get() instanceof DataView) { ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder(); for (Map.Entry<DataQuery, Object> entry : ((DataView) val.get()).getValues(false).entrySet()) { builder.put(entry.getKey().asString('.'), ensureMappingOf(entry.getValue())); } return Optional.of(builder.build()); } else if (val.get() instanceof Map) { return Optional.of((Map<?, ?>) ensureMappingOf(val.get())); } } return Optional.empty(); }
@SuppressWarnings("unchecked") @Override public <T extends DataSerializable> Optional<T> getSerializable(DataQuery path, Class<T> clazz) { checkNotNull(path, "path"); checkNotNull(clazz, "clazz"); if (clazz.isAssignableFrom(CatalogType.class)) { final Optional<T> catalog = (Optional<T>) getCatalogType(path, ((Class<? extends CatalogType>) clazz)); if (catalog.isPresent()) { return catalog; } } return getUnsafeView(path).flatMap(view -> Sponge.getDataManager().getBuilder(clazz) .flatMap(builder -> builder.build(view)) ); }
if (parts.size() > 1) { DataQuery subQuery = of(key); Optional<DataView> subViewOptional = this.getUnsafeView(subQuery); DataView subView; if (!subViewOptional.isPresent()) { this.createView(subQuery); subView = (DataView) this.map.get(key); } else { copyDataView(path, (DataView) value); } else if (value instanceof DataSerializable) { DataContainer valueContainer = ((DataSerializable) value).toContainer(); checkArgument(!(valueContainer).equals(this), "Cannot insert self-referencing DataSerializable"); copyDataView(path, valueContainer); } else if (value instanceof CatalogType) { return set(path, ((CatalogType) value).getId()); } else if (manager != null && manager.getTranslator(value.getClass()).isPresent()) { DataTranslator serializer = manager.getTranslator(value.getClass()).get(); copyDataView(path, container); } else if (value instanceof Collection) { setCollection(key, (Collection) value); } else if (value instanceof Map) { setMap(key, (Map) value); } else if (value.getClass().isArray()) { if (this.safety == SafetyMode.ALL_DATA_CLONED || this.safety == SafetyMode.CLONED_ON_SET) {
@Override public Optional<Byte> getByte(DataQuery path) { return get(path).flatMap(Coerce::asByte); }
@SuppressWarnings("unchecked") @Override public <T extends DataSerializable> Optional<List<T>> getSerializableList(DataQuery path, Class<T> clazz) { checkNotNull(path, "path"); checkNotNull(clazz, "clazz"); return Stream.<Supplier<Optional<List<T>>>>of( () -> { if (clazz.isAssignableFrom(CatalogType.class)) { return (Optional<List<T>>) (Optional<?>) getCatalogTypeList(path, (Class<? extends CatalogType>) clazz); } return Optional.empty(); }, () -> getViewList(path).flatMap(list -> Sponge.getDataManager().getBuilder(clazz).map(builder -> list.stream() .map(builder::build) .filter(Optional::isPresent) .map(Optional::get) .collect(Collectors.toList()) ) ) ) .map(Supplier::get) .filter(Optional::isPresent) .map(Optional::get) .findFirst(); }
DataView internalView = (DataView) object; for (Map.Entry<DataQuery, Object> entry : internalView.getValues(false).entrySet()) { view.set(entry.getKey(), entry.getValue()); builder.add(((CatalogType) object).getId()); } else if (object instanceof Map) { builder.add(ensureSerialization((Map) object)); } else if (object instanceof Collection) { builder.add(ensureSerialization((Collection) object)); } else { if (manager != null) {
@SuppressWarnings("rawtypes") private ImmutableList<Object> ensureSerialization(Collection<?> collection) { ImmutableList.Builder<Object> objectBuilder = ImmutableList.builder(); collection.forEach(element -> { if (element instanceof Collection) { objectBuilder.add(ensureSerialization((Collection) element)); } else if (element instanceof DataSerializable) { objectBuilder.add(((DataSerializable) element).toContainer()); } else { objectBuilder.add(element); } }); return objectBuilder.build(); }
@SuppressWarnings("rawtypes") private Object ensureMappingOf(Object object) { if (object instanceof DataView) { final ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder(); for (Map.Entry<DataQuery, Object> entry : ((DataView) object).getValues(false).entrySet()) { builder.put(entry.getKey().asString('.'), ensureMappingOf(entry.getValue())); } return builder.build(); } else if (object instanceof Map) { final ImmutableMap.Builder<Object, Object> builder = ImmutableMap.builder(); for (Map.Entry<?, ?> entry : ((Map<?, ?>) object).entrySet()) { builder.put(entry.getKey().toString(), ensureMappingOf(entry.getValue())); } return builder.build(); } else if (object instanceof Collection) { final ImmutableList.Builder<Object> builder = ImmutableList.builder(); for (Object entry : (Collection) object) { builder.add(ensureMappingOf(entry)); } return builder.build(); } else { return object; } }
if (parts.size() > 1) { DataQuery subQuery = of(key); Optional<DataView> subViewOptional = this.getUnsafeView(subQuery); DataView subView; if (!subViewOptional.isPresent()) { this.createView(subQuery); subView = (DataView) this.map.get(key); } else { copyDataView(path, (DataView) value); } else if (value instanceof DataSerializable) { DataContainer valueContainer = ((DataSerializable) value).toContainer(); checkArgument(!(valueContainer).equals(this), "Cannot insert self-referencing DataSerializable"); copyDataView(path, valueContainer); } else if (value instanceof CatalogType) { return set(path, ((CatalogType) value).getId()); } else if (manager != null && manager.getTranslator(value.getClass()).isPresent()) { DataTranslator serializer = manager.getTranslator(value.getClass()).get(); copyDataView(path, container); } else if (value instanceof Collection) { setCollection(key, (Collection) value); } else if (value instanceof Map) { setMap(key, (Map) value); } else if (value.getClass().isArray()) { if (this.safety == SafetyMode.ALL_DATA_CLONED || this.safety == SafetyMode.CLONED_ON_SET) {
@Override public Optional<String> getString(DataQuery path) { return get(path).flatMap(Coerce::asString); }
@SuppressWarnings("unchecked") @Override public <T extends DataSerializable> Optional<T> getSerializable(DataQuery path, Class<T> clazz) { checkNotNull(path, "path"); checkNotNull(clazz, "clazz"); if (clazz.isAssignableFrom(CatalogType.class)) { final Optional<T> catalog = (Optional<T>) getCatalogType(path, ((Class<? extends CatalogType>) clazz)); if (catalog.isPresent()) { return catalog; } } return getUnsafeView(path).flatMap(view -> Sponge.getDataManager().getBuilder(clazz) .flatMap(builder -> builder.build(view)) ); }
@Override public Optional<? extends Map<?, ?>> getMap(DataQuery path) { Optional<Object> val = get(path); if (val.isPresent()) { if (val.get() instanceof DataView) { ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder(); for (Map.Entry<DataQuery, Object> entry : ((DataView) val.get()).getValues(false).entrySet()) { builder.put(entry.getKey().asString('.'), ensureMappingOf(entry.getValue())); } return Optional.of(builder.build()); } else if (val.get() instanceof Map) { return Optional.of((Map<?, ?>) ensureMappingOf(val.get())); } } return Optional.empty(); }
@SuppressWarnings("unchecked") @Override public <T extends DataSerializable> Optional<List<T>> getSerializableList(DataQuery path, Class<T> clazz) { checkNotNull(path, "path"); checkNotNull(clazz, "clazz"); return Stream.<Supplier<Optional<List<T>>>>of( () -> { if (clazz.isAssignableFrom(CatalogType.class)) { return (Optional<List<T>>) (Optional<?>) getCatalogTypeList(path, (Class<? extends CatalogType>) clazz); } return Optional.empty(); }, () -> getViewList(path).flatMap(list -> Sponge.getDataManager().getBuilder(clazz).map(builder -> list.stream() .map(builder::build) .filter(Optional::isPresent) .map(Optional::get) .collect(Collectors.toList()) ) ) ) .map(Supplier::get) .filter(Optional::isPresent) .map(Optional::get) .findFirst(); }
DataView internalView = (DataView) object; for (Map.Entry<DataQuery, Object> entry : internalView.getValues(false).entrySet()) { view.set(entry.getKey(), entry.getValue()); builder.add(ensureSerialization((Map) object)); } else if (object instanceof Collection) { builder.add(ensureSerialization((Collection) object)); } else { if (manager != null) {
@SuppressWarnings("rawtypes") private ImmutableMap<?, ?> ensureSerialization(Map<?, ?> map) { ImmutableMap.Builder<Object, Object> builder = ImmutableMap.builder(); map.entrySet().forEach(entry -> { if (entry.getValue() instanceof Map) { builder.put(entry.getKey(), ensureSerialization((Map) entry.getValue())); } else if (entry.getValue() instanceof DataSerializable) { builder.put(entry.getKey(), ((DataSerializable) entry.getValue()).toContainer()); } else if (entry.getValue() instanceof Collection) { builder.put(entry.getKey(), ensureSerialization((Collection) entry.getValue())); } else { builder.put(entry.getKey(), entry.getValue()); } }); return builder.build(); }