*/
package org.opendaylight.restconf.common.util;
+import com.google.common.base.Preconditions;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PushbackInputStream;
import java.util.ArrayList;
import java.util.List;
+import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.xml.stream.events.StartElement;
return superType;
}
+ /**
+ * Utility method to find out if is provided {@link InputStream} empty.
+ *
+ * @param entityStream {@link InputStream} to be checked if it is empty.
+ * @return Empty Optional if provided input stream is empty or Optional
+ * containing input stream otherwise.
+ *
+ * @throws IOException if an IO error arises during stream inspection.
+ * @throws NullPointerException if provided stream is null.
+ *
+ */
+ public static Optional<InputStream> isInputStreamEmpty(final InputStream entityStream) throws IOException {
+ Preconditions.checkNotNull(entityStream);
+ final PushbackInputStream pushbackInputStream = new PushbackInputStream(entityStream);
+
+ int firstByte = pushbackInputStream.read();
+ if (firstByte == -1) {
+ return Optional.empty();
+ } else {
+ pushbackInputStream.unread(firstByte);
+ return Optional.of(pushbackInputStream);
+ }
+ }
+
public static IdentityValuesDTO asInstanceIdentifier(final String value, final PrefixesMaping prefixMap) {
final String valueTrimmed = value.trim();
if (!valueTrimmed.startsWith("/")) {
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
+import java.util.Optional;
import javax.ws.rs.Consumes;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag;
import org.opendaylight.restconf.common.errors.RestconfError.ErrorType;
+import org.opendaylight.restconf.common.util.RestUtil;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
private static NormalizedNodeContext readFrom(final InstanceIdentifierContext<?> path,
final InputStream entityStream, final boolean isPost)
throws IOException {
- if (entityStream.available() < 1) {
+ final Optional<InputStream> nonEmptyInputStreamOptional = RestUtil.isInputStreamEmpty(entityStream);
+ if (!nonEmptyInputStreamOptional.isPresent()) {
return new NormalizedNodeContext(path, null);
}
final NormalizedNodeResult resultHolder = new NormalizedNodeResult();
}
final JsonParserStream jsonParser = JsonParserStream.create(writer, path.getSchemaContext(), parentSchema);
- final JsonReader reader = new JsonReader(new InputStreamReader(entityStream));
+ final JsonReader reader = new JsonReader(new InputStreamReader(nonEmptyInputStreamOptional.get()));
jsonParser.parse(reader);
NormalizedNode<?, ?> result = resultHolder.getResult();
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
+import java.util.Optional;
import javax.annotation.Nonnull;
import javax.ws.rs.Consumes;
import javax.ws.rs.WebApplicationException;
import org.opendaylight.restconf.common.patch.PatchContext;
import org.opendaylight.restconf.common.patch.PatchEditOperation;
import org.opendaylight.restconf.common.patch.PatchEntity;
+import org.opendaylight.restconf.common.util.RestUtil;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
private PatchContext readFrom(final InstanceIdentifierContext<?> path, final InputStream entityStream)
throws IOException {
- if (entityStream.available() < 1) {
+ final Optional<InputStream> nonEmptyInputStreamOptional = RestUtil.isInputStreamEmpty(entityStream);
+ if (!nonEmptyInputStreamOptional.isPresent()) {
return new PatchContext(path, null, null);
}
- final JsonReader jsonReader = new JsonReader(new InputStreamReader(entityStream));
+ final JsonReader jsonReader = new JsonReader(new InputStreamReader(nonEmptyInputStreamOptional.get()));
final List<PatchEntity> resultList = read(jsonReader, path);
jsonReader.close();
import java.util.Collection;
import java.util.Deque;
import java.util.List;
+import java.util.Optional;
import javax.ws.rs.Consumes;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag;
import org.opendaylight.restconf.common.errors.RestconfError.ErrorType;
+import org.opendaylight.restconf.common.util.RestUtil;
import org.opendaylight.yangtools.util.xml.UntrustedXML;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
private NormalizedNodeContext readFrom(final InputStream entityStream) throws IOException, SAXException,
XMLStreamException, ParserConfigurationException, URISyntaxException {
final InstanceIdentifierContext<?> path = getInstanceIdentifierContext();
-
- if (entityStream.available() < 1) {
+ final Optional<InputStream> nonEmptyInputStreamOptional = RestUtil.isInputStreamEmpty(entityStream);
+ if (!nonEmptyInputStreamOptional.isPresent()) {
// represent empty nopayload input
return new NormalizedNodeContext(path, null);
}
- final Document doc = UntrustedXML.newDocumentBuilder().parse(entityStream);
+ final Document doc = UntrustedXML.newDocumentBuilder().parse(nonEmptyInputStreamOptional.get());
return parse(path, doc);
}
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import java.util.Optional;
import javax.annotation.Nonnull;
import javax.ws.rs.Consumes;
import javax.ws.rs.WebApplicationException;
import org.opendaylight.restconf.common.patch.PatchContext;
import org.opendaylight.restconf.common.patch.PatchEditOperation;
import org.opendaylight.restconf.common.patch.PatchEntity;
+import org.opendaylight.restconf.common.util.RestUtil;
import org.opendaylight.yangtools.util.xml.UntrustedXML;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
try {
final InstanceIdentifierContext<?> path = getInstanceIdentifierContext();
-
- if (entityStream.available() < 1) {
+ final Optional<InputStream> nonEmptyInputStreamOptional = RestUtil.isInputStreamEmpty(entityStream);
+ if (!nonEmptyInputStreamOptional.isPresent()) {
// represent empty nopayload input
return new PatchContext(path, null, null);
}
- final Document doc = UntrustedXML.newDocumentBuilder().parse(entityStream);
+ final Document doc = UntrustedXML.newDocumentBuilder().parse(nonEmptyInputStreamOptional.get());
return parse(path, doc);
} catch (final RestconfDocumentedException e) {
throw e;
import com.google.common.base.Optional;
import java.io.IOException;
import java.io.InputStream;
+import java.io.PushbackInputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.HttpMethod;
final MultivaluedMap<String, String> httpHeaders, final InputStream entityStream) throws IOException,
WebApplicationException {
final InstanceIdentifierContext<?> path = getInstanceIdentifierContext();
- if (entityStream.available() < 1) {
+
+ final PushbackInputStream pushbackInputStream = new PushbackInputStream(entityStream);
+
+ int firstByte = pushbackInputStream.read();
+ if (firstByte == -1) {
return emptyBody(path);
+ } else {
+ pushbackInputStream.unread(firstByte);
+ return readBody(path, pushbackInputStream);
}
- return readBody(path, entityStream);
}
/**