Merge pull request #19250 from ktoso/wip-fix-multipart-model-java6-ktoso

!htc fix multipart model (java6 had trouble)
This commit is contained in:
Konrad Malawski 2015-12-21 16:55:57 +01:00
commit ddceadff7b
3 changed files with 30 additions and 15 deletions

View file

@ -69,7 +69,7 @@ public interface Multipart {
* Basic model for multipart content as defined by http://tools.ietf.org/html/rfc2046.
*/
interface General extends Multipart {
Source<? extends Multipart.General.BodyPart, Object> getParts();
Source<? extends Multipart.General.BodyPart, Object> getGeneralParts();
Future<Multipart.General.Strict> toStrict(long timeoutMillis, Materializer materializer);
@ -92,7 +92,7 @@ public interface Multipart {
* All parts must have distinct names. (This is not verified!)
*/
interface FormData extends Multipart {
Source<? extends Multipart.FormData.BodyPart, Object> getParts();
Source<? extends Multipart.FormData.BodyPart, Object> getFormDataParts();
Future<Multipart.FormData.Strict> toStrict(long timeoutMillis, Materializer materializer);
@ -120,7 +120,7 @@ public interface Multipart {
* https://tools.ietf.org/html/rfc7233#section-5.4.1 and https://tools.ietf.org/html/rfc7233#appendix-A
*/
interface ByteRanges extends Multipart {
Source<? extends Multipart.ByteRanges.BodyPart, Object> getParts();
Source<? extends Multipart.ByteRanges.BodyPart, Object> getByteRangeParts();
Future<Multipart.ByteRanges.Strict> toStrict(long timeoutMillis, Materializer materializer);

View file

@ -5,7 +5,6 @@
package akka.http.scaladsl.model
import java.io.File
import scala.collection.immutable.VectorBuilder
import scala.concurrent.duration.FiniteDuration
import scala.concurrent.Future
import scala.collection.immutable
@ -203,8 +202,13 @@ object Multipart {
strictify(parts)(_.toStrict(timeout)).fast.map(General.Strict(mediaType, _))
}
// TODO: bring back once JDK7+, overload resolution in JDK6 freaks out with getParts overriding with more specific generic param
// /** Java API */
// override def getParts: JSource[_ <: jm.Multipart.General.BodyPart, AnyRef] =
// super.getParts.asInstanceOf[JSource[_ <: jm.Multipart.General.BodyPart, AnyRef]]
/** Java API */
override def getParts: JSource[_ <: jm.Multipart.General.BodyPart, AnyRef] =
override def getGeneralParts: JSource[_ <: jm.Multipart.General.BodyPart, AnyRef] =
super.getParts.asInstanceOf[JSource[_ <: jm.Multipart.General.BodyPart, AnyRef]]
/** Java API */
@ -216,8 +220,8 @@ object Multipart {
def apply(_mediaType: MediaType.Multipart, _parts: Source[Multipart.General.BodyPart, Any]): Multipart.General =
new Multipart.General {
def mediaType = _mediaType
def parts = _parts
override def mediaType = _mediaType
override def parts = _parts
override def toString = s"General($mediaType, $parts)"
}
@ -229,7 +233,7 @@ object Multipart {
*/
case class Strict(mediaType: MediaType.Multipart, strictParts: immutable.Seq[Multipart.General.BodyPart.Strict])
extends Multipart.General with Multipart.Strict with jm.Multipart.General.Strict {
def parts: Source[Multipart.General.BodyPart.Strict, Any] = Source(strictParts)
override def parts: Source[Multipart.General.BodyPart.Strict, Any] = Source(strictParts)
override def toStrict(timeout: FiniteDuration)(implicit fm: Materializer) = FastFuture.successful(this)
override def productPrefix = "General.Strict"
@ -246,7 +250,7 @@ object Multipart {
* Body part of the [[General]] model.
*/
sealed abstract class BodyPart extends Multipart.BodyPart with jm.Multipart.General.BodyPart {
def toStrict(timeout: FiniteDuration)(implicit fm: Materializer): Future[Multipart.General.BodyPart.Strict] = {
override def toStrict(timeout: FiniteDuration)(implicit fm: Materializer): Future[Multipart.General.BodyPart.Strict] = {
import fm.executionContext
entity.toStrict(timeout).map(BodyPart.Strict(_, headers))
}
@ -305,9 +309,9 @@ object Multipart {
* All parts must have distinct names. (This is not verified!)
*/
sealed abstract class FormData extends Multipart with jm.Multipart.FormData {
def mediaType = MediaTypes.`multipart/form-data`
override def mediaType = MediaTypes.`multipart/form-data`
def parts: Source[Multipart.FormData.BodyPart, Any]
override def parts: Source[Multipart.FormData.BodyPart, Any]
def toStrict(timeout: FiniteDuration)(implicit fm: Materializer): Future[Multipart.FormData.Strict] = {
import fm.executionContext
@ -333,6 +337,8 @@ object Multipart {
def apply(_parts: Source[Multipart.FormData.BodyPart, Any]): Multipart.FormData =
new Multipart.FormData {
def parts = _parts
override def getFormDataParts: JSource[jm.Multipart.FormData.BodyPart, AnyRef] =
parts.asJava.asInstanceOf[JSource[_ <: jm.Multipart.FormData.BodyPart, AnyRef]]
override def toString = s"FormData($parts)"
}
@ -350,7 +356,9 @@ object Multipart {
*/
case class Strict(strictParts: immutable.Seq[Multipart.FormData.BodyPart.Strict])
extends FormData with Multipart.Strict with jm.Multipart.FormData.Strict {
def parts: Source[Multipart.FormData.BodyPart.Strict, Any] = Source(strictParts)
override def parts: Source[Multipart.FormData.BodyPart.Strict, Any] = Source(strictParts)
override def getFormDataParts: JSource[jm.Multipart.FormData.BodyPart, AnyRef] =
parts.asJava.asInstanceOf[JSource[_ <: jm.Multipart.FormData.BodyPart, AnyRef]]
override def toStrict(timeout: FiniteDuration)(implicit fm: Materializer) = FastFuture.successful(this)
override def productPrefix = "FormData.Strict"
@ -361,6 +369,7 @@ object Multipart {
/** Java API */
override def getStrictParts: java.lang.Iterable[jm.Multipart.FormData.BodyPart.Strict] =
super.getStrictParts.asInstanceOf[java.lang.Iterable[jm.Multipart.FormData.BodyPart.Strict]]
}
/**
@ -475,7 +484,9 @@ object Multipart {
def apply(_parts: Source[Multipart.ByteRanges.BodyPart, Any]): Multipart.ByteRanges =
new Multipart.ByteRanges {
def parts = _parts
override def parts = _parts
override def getByteRangeParts: JSource[jm.Multipart.ByteRanges.BodyPart, AnyRef] =
parts.asJava.asInstanceOf[JSource[jm.Multipart.ByteRanges.BodyPart, AnyRef]]
override def toString = s"ByteRanges($parts)"
}
@ -484,7 +495,7 @@ object Multipart {
*/
case class Strict(strictParts: immutable.Seq[Multipart.ByteRanges.BodyPart.Strict])
extends Multipart.ByteRanges with Multipart.Strict with jm.Multipart.ByteRanges.Strict {
def parts: Source[Multipart.ByteRanges.BodyPart.Strict, Any] = Source(strictParts)
override def parts: Source[Multipart.ByteRanges.BodyPart.Strict, Any] = Source(strictParts)
override def toStrict(timeout: FiniteDuration)(implicit fm: Materializer) = FastFuture.successful(this)
override def productPrefix = "ByteRanges.Strict"
@ -495,6 +506,9 @@ object Multipart {
/** Java API */
override def getStrictParts: java.lang.Iterable[jm.Multipart.ByteRanges.BodyPart.Strict] =
super.getStrictParts.asInstanceOf[java.lang.Iterable[jm.Multipart.ByteRanges.BodyPart.Strict]]
override def getByteRangeParts: JSource[jm.Multipart.ByteRanges.BodyPart, AnyRef] =
parts.asJava.asInstanceOf[JSource[jm.Multipart.ByteRanges.BodyPart.Strict, AnyRef]]
}
/**

View file

@ -95,7 +95,8 @@ public class TcpTest extends StreamTest {
} catch (BindFailedException e) {
// expected
} catch (Exception e) {
throw new AssertionError("failed", e);
// throw new AssertionError("failed", e); // TODO: bring back once we're JDK7+
throw new RuntimeException("failed", e);
}
return null;
}