Search in sources :

Example 16 with InternalServerErrorException

use of javax.ws.rs.InternalServerErrorException in project jersey by jersey.

the class HelloWorldTest method testConnectionClosingOnExceptionsForErrorResponses.

/**
     * JERSEY-2157 reproducer.
     * <p>
     * The test ensures that entities of the error responses which cause
     * WebApplicationException being thrown by a JAX-RS client are buffered
     * and that the underlying input connections are automatically released
     * in such case.
     */
@Test
public void testConnectionClosingOnExceptionsForErrorResponses() {
    final BasicClientConnectionManager cm = new BasicClientConnectionManager();
    final AtomicInteger connectionCounter = new AtomicInteger(0);
    final ClientConfig config = new ClientConfig().property(ApacheClientProperties.CONNECTION_MANAGER, new ClientConnectionManager() {

        @Override
        public SchemeRegistry getSchemeRegistry() {
            return cm.getSchemeRegistry();
        }

        @Override
        public ClientConnectionRequest requestConnection(final HttpRoute route, final Object state) {
            connectionCounter.incrementAndGet();
            final ClientConnectionRequest wrappedRequest = cm.requestConnection(route, state);
            /**
                         * To explain the following long piece of code:
                         *
                         * All the code does is to just create a wrapper implementations
                         * for the AHC connection management interfaces.
                         *
                         * The only really important piece of code is the
                         * {@link org.apache.http.conn.ManagedClientConnection#releaseConnection()} implementation,
                         * where the connectionCounter is decremented when a managed connection instance
                         * is released by AHC runtime. In our test, this is expected to happen
                         * as soon as the exception is created for an error response
                         * (as the error response entity gets buffered in
                         * {@link org.glassfish.jersey.client.JerseyInvocation#convertToException(javax.ws.rs.core.Response)}).
                         */
            return new ClientConnectionRequest() {

                @Override
                public ManagedClientConnection getConnection(long timeout, TimeUnit tunit) throws InterruptedException, ConnectionPoolTimeoutException {
                    final ManagedClientConnection wrappedConnection = wrappedRequest.getConnection(timeout, tunit);
                    return new ManagedClientConnection() {

                        @Override
                        public boolean isSecure() {
                            return wrappedConnection.isSecure();
                        }

                        @Override
                        public HttpRoute getRoute() {
                            return wrappedConnection.getRoute();
                        }

                        @Override
                        public SSLSession getSSLSession() {
                            return wrappedConnection.getSSLSession();
                        }

                        @Override
                        public void open(HttpRoute route, HttpContext context, HttpParams params) throws IOException {
                            wrappedConnection.open(route, context, params);
                        }

                        @Override
                        public void tunnelTarget(boolean secure, HttpParams params) throws IOException {
                            wrappedConnection.tunnelTarget(secure, params);
                        }

                        @Override
                        public void tunnelProxy(HttpHost next, boolean secure, HttpParams params) throws IOException {
                            wrappedConnection.tunnelProxy(next, secure, params);
                        }

                        @Override
                        public void layerProtocol(HttpContext context, HttpParams params) throws IOException {
                            wrappedConnection.layerProtocol(context, params);
                        }

                        @Override
                        public void markReusable() {
                            wrappedConnection.markReusable();
                        }

                        @Override
                        public void unmarkReusable() {
                            wrappedConnection.unmarkReusable();
                        }

                        @Override
                        public boolean isMarkedReusable() {
                            return wrappedConnection.isMarkedReusable();
                        }

                        @Override
                        public void setState(Object state) {
                            wrappedConnection.setState(state);
                        }

                        @Override
                        public Object getState() {
                            return wrappedConnection.getState();
                        }

                        @Override
                        public void setIdleDuration(long duration, TimeUnit unit) {
                            wrappedConnection.setIdleDuration(duration, unit);
                        }

                        @Override
                        public boolean isResponseAvailable(int timeout) throws IOException {
                            return wrappedConnection.isResponseAvailable(timeout);
                        }

                        @Override
                        public void sendRequestHeader(HttpRequest request) throws HttpException, IOException {
                            wrappedConnection.sendRequestHeader(request);
                        }

                        @Override
                        public void sendRequestEntity(HttpEntityEnclosingRequest request) throws HttpException, IOException {
                            wrappedConnection.sendRequestEntity(request);
                        }

                        @Override
                        public HttpResponse receiveResponseHeader() throws HttpException, IOException {
                            return wrappedConnection.receiveResponseHeader();
                        }

                        @Override
                        public void receiveResponseEntity(HttpResponse response) throws HttpException, IOException {
                            wrappedConnection.receiveResponseEntity(response);
                        }

                        @Override
                        public void flush() throws IOException {
                            wrappedConnection.flush();
                        }

                        @Override
                        public void close() throws IOException {
                            wrappedConnection.close();
                        }

                        @Override
                        public boolean isOpen() {
                            return wrappedConnection.isOpen();
                        }

                        @Override
                        public boolean isStale() {
                            return wrappedConnection.isStale();
                        }

                        @Override
                        public void setSocketTimeout(int timeout) {
                            wrappedConnection.setSocketTimeout(timeout);
                        }

                        @Override
                        public int getSocketTimeout() {
                            return wrappedConnection.getSocketTimeout();
                        }

                        @Override
                        public void shutdown() throws IOException {
                            wrappedConnection.shutdown();
                        }

                        @Override
                        public HttpConnectionMetrics getMetrics() {
                            return wrappedConnection.getMetrics();
                        }

                        @Override
                        public InetAddress getLocalAddress() {
                            return wrappedConnection.getLocalAddress();
                        }

                        @Override
                        public int getLocalPort() {
                            return wrappedConnection.getLocalPort();
                        }

                        @Override
                        public InetAddress getRemoteAddress() {
                            return wrappedConnection.getRemoteAddress();
                        }

                        @Override
                        public int getRemotePort() {
                            return wrappedConnection.getRemotePort();
                        }

                        @Override
                        public void releaseConnection() throws IOException {
                            connectionCounter.decrementAndGet();
                            wrappedConnection.releaseConnection();
                        }

                        @Override
                        public void abortConnection() throws IOException {
                            wrappedConnection.abortConnection();
                        }

                        @Override
                        public String getId() {
                            return wrappedConnection.getId();
                        }

                        @Override
                        public void bind(Socket socket) throws IOException {
                            wrappedConnection.bind(socket);
                        }

                        @Override
                        public Socket getSocket() {
                            return wrappedConnection.getSocket();
                        }
                    };
                }

                @Override
                public void abortRequest() {
                    wrappedRequest.abortRequest();
                }
            };
        }

        @Override
        public void releaseConnection(ManagedClientConnection conn, long keepalive, TimeUnit tunit) {
            cm.releaseConnection(conn, keepalive, tunit);
        }

        @Override
        public void closeExpiredConnections() {
            cm.closeExpiredConnections();
        }

        @Override
        public void closeIdleConnections(long idletime, TimeUnit tunit) {
            cm.closeIdleConnections(idletime, tunit);
        }

        @Override
        public void shutdown() {
            cm.shutdown();
        }
    });
    config.connectorProvider(new ApacheConnectorProvider());
    final Client client = ClientBuilder.newClient(config);
    final WebTarget rootTarget = client.target(getBaseUri()).path(ROOT_PATH);
    // Test that connection is getting closed properly for error responses.
    try {
        final String response = rootTarget.path("error").request().get(String.class);
        fail("Exception expected. Received: " + response);
    } catch (InternalServerErrorException isee) {
    // do nothing - connection should be closed properly by now
    }
    // Fail if the previous connection has not been closed automatically.
    assertEquals(0, connectionCounter.get());
    try {
        final String response = rootTarget.path("error2").request().get(String.class);
        fail("Exception expected. Received: " + response);
    } catch (InternalServerErrorException isee) {
        assertEquals("Received unexpected data.", "Error2.", isee.getResponse().readEntity(String.class));
        // Test buffering:
        // second read would fail if entity was not buffered
        assertEquals("Unexpected data in the entity buffer.", "Error2.", isee.getResponse().readEntity(String.class));
    }
    assertEquals(0, connectionCounter.get());
}
Also used : ClientConnectionRequest(org.apache.http.conn.ClientConnectionRequest) ConnectionPoolTimeoutException(org.apache.http.conn.ConnectionPoolTimeoutException) HttpConnectionMetrics(org.apache.http.HttpConnectionMetrics) HttpHost(org.apache.http.HttpHost) SchemeRegistry(org.apache.http.conn.scheme.SchemeRegistry) HttpEntityEnclosingRequest(org.apache.http.HttpEntityEnclosingRequest) TimeUnit(java.util.concurrent.TimeUnit) HttpException(org.apache.http.HttpException) ClientConfig(org.glassfish.jersey.client.ClientConfig) Client(javax.ws.rs.client.Client) HttpRequest(org.apache.http.HttpRequest) ManagedClientConnection(org.apache.http.conn.ManagedClientConnection) SSLSession(javax.net.ssl.SSLSession) HttpContext(org.apache.http.protocol.HttpContext) HttpResponse(org.apache.http.HttpResponse) IOException(java.io.IOException) PoolingHttpClientConnectionManager(org.apache.http.impl.conn.PoolingHttpClientConnectionManager) BasicClientConnectionManager(org.apache.http.impl.conn.BasicClientConnectionManager) ClientConnectionManager(org.apache.http.conn.ClientConnectionManager) HttpClientConnectionManager(org.apache.http.conn.HttpClientConnectionManager) HttpRoute(org.apache.http.conn.routing.HttpRoute) HttpParams(org.apache.http.params.HttpParams) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) BasicClientConnectionManager(org.apache.http.impl.conn.BasicClientConnectionManager) InternalServerErrorException(javax.ws.rs.InternalServerErrorException) WebTarget(javax.ws.rs.client.WebTarget) InetAddress(java.net.InetAddress) Socket(java.net.Socket) JerseyTest(org.glassfish.jersey.test.JerseyTest) Test(org.junit.Test)

Example 17 with InternalServerErrorException

use of javax.ws.rs.InternalServerErrorException in project jersey by jersey.

the class ItemStoreResource method replayMissedEvents.

private void replayMissedEvents(final int lastEventId, final EventOutput eventOutput) {
    try {
        storeLock.readLock().lock();
        final int firstUnreceived = lastEventId + 1;
        final int missingCount = itemStore.size() - firstUnreceived;
        if (missingCount > 0) {
            LOGGER.info("Replaying events - starting with id " + firstUnreceived);
            final ListIterator<String> it = itemStore.subList(firstUnreceived, itemStore.size()).listIterator();
            while (it.hasNext()) {
                eventOutput.write(createItemEvent(it.nextIndex() + firstUnreceived, it.next()));
            }
        } else {
            LOGGER.info("No events to replay.");
        }
    } catch (IOException ex) {
        throw new InternalServerErrorException("Error replaying missed events", ex);
    } finally {
        storeLock.readLock().unlock();
    }
}
Also used : InternalServerErrorException(javax.ws.rs.InternalServerErrorException) IOException(java.io.IOException)

Example 18 with InternalServerErrorException

use of javax.ws.rs.InternalServerErrorException in project jersey by jersey.

the class AbstractCollectionJaxbProvider method readFrom.

@Override
@SuppressWarnings("unchecked")
public final Object readFrom(Class<Object> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream inputStream) throws IOException {
    final EntityInputStream entityStream = EntityInputStream.create(inputStream);
    if (entityStream.isEmpty()) {
        throw new NoContentException(LocalizationMessages.ERROR_READING_ENTITY_MISSING());
    }
    try {
        final Class<?> elementType = getElementClass(type, genericType);
        final Unmarshaller u = getUnmarshaller(elementType, mediaType);
        final XMLStreamReader r = getXMLStreamReader(elementType, mediaType, u, entityStream);
        boolean jaxbElement = false;
        Collection<Object> l = null;
        if (type.isArray()) {
            l = new ArrayList<Object>();
        } else {
            try {
                l = (Collection<Object>) type.newInstance();
            } catch (Exception e) {
                for (Class<?> c : DEFAULT_IMPLS) {
                    if (type.isAssignableFrom(c)) {
                        try {
                            l = (Collection<Object>) c.newInstance();
                            break;
                        } catch (InstantiationException ex) {
                            LOGGER.log(Level.WARNING, LocalizationMessages.UNABLE_TO_INSTANTIATE_CLASS(c.getName()), ex);
                        } catch (IllegalAccessException ex) {
                            LOGGER.log(Level.WARNING, LocalizationMessages.UNABLE_TO_INSTANTIATE_CLASS(c.getName()), ex);
                        } catch (SecurityException ex) {
                            LOGGER.log(Level.WARNING, LocalizationMessages.UNABLE_TO_INSTANTIATE_CLASS(c.getName()), ex);
                        }
                    }
                }
            }
        }
        if (l == null) {
            l = new ArrayList<Object>();
        }
        // Move to root element
        int event = r.next();
        while (event != XMLStreamReader.START_ELEMENT) {
            event = r.next();
        }
        // Move to first child (if any)
        event = r.next();
        while (event != XMLStreamReader.START_ELEMENT && event != XMLStreamReader.END_DOCUMENT) {
            event = r.next();
        }
        while (event != XMLStreamReader.END_DOCUMENT) {
            if (elementType.isAnnotationPresent(XmlRootElement.class)) {
                l.add(u.unmarshal(r));
            } else if (elementType.isAnnotationPresent(XmlType.class)) {
                l.add(u.unmarshal(r, elementType).getValue());
            } else {
                l.add(u.unmarshal(r, elementType));
                jaxbElement = true;
            }
            // Move to next peer (if any)
            event = r.getEventType();
            while (event != XMLStreamReader.START_ELEMENT && event != XMLStreamReader.END_DOCUMENT) {
                event = r.next();
            }
        }
        return (type.isArray()) ? createArray(l, jaxbElement ? JAXBElement.class : elementType) : l;
    } catch (UnmarshalException ex) {
        throw new BadRequestException(ex);
    } catch (XMLStreamException ex) {
        throw new BadRequestException(ex);
    } catch (JAXBException ex) {
        throw new InternalServerErrorException(ex);
    }
}
Also used : XMLStreamReader(javax.xml.stream.XMLStreamReader) JAXBException(javax.xml.bind.JAXBException) NoContentException(javax.ws.rs.core.NoContentException) XMLStreamException(javax.xml.stream.XMLStreamException) BadRequestException(javax.ws.rs.BadRequestException) UnmarshalException(javax.xml.bind.UnmarshalException) NoContentException(javax.ws.rs.core.NoContentException) IOException(java.io.IOException) InternalServerErrorException(javax.ws.rs.InternalServerErrorException) JAXBException(javax.xml.bind.JAXBException) WebApplicationException(javax.ws.rs.WebApplicationException) XmlType(javax.xml.bind.annotation.XmlType) XMLStreamException(javax.xml.stream.XMLStreamException) UnmarshalException(javax.xml.bind.UnmarshalException) Collection(java.util.Collection) BadRequestException(javax.ws.rs.BadRequestException) InternalServerErrorException(javax.ws.rs.InternalServerErrorException) EntityInputStream(org.glassfish.jersey.message.internal.EntityInputStream) Unmarshaller(javax.xml.bind.Unmarshaller)

Example 19 with InternalServerErrorException

use of javax.ws.rs.InternalServerErrorException in project jersey by jersey.

the class AbstractJaxbElementProvider method writeTo.

@Override
public final void writeTo(JAXBElement<?> t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException {
    try {
        final Marshaller m = getMarshaller(t.getDeclaredType(), mediaType);
        final Charset c = getCharset(mediaType);
        if (c != UTF8) {
            m.setProperty(Marshaller.JAXB_ENCODING, c.name());
        }
        setHeader(m, annotations);
        writeTo(t, mediaType, c, m, entityStream);
    } catch (JAXBException ex) {
        throw new InternalServerErrorException(ex);
    }
}
Also used : Marshaller(javax.xml.bind.Marshaller) JAXBException(javax.xml.bind.JAXBException) Charset(java.nio.charset.Charset) InternalServerErrorException(javax.ws.rs.InternalServerErrorException)

Example 20 with InternalServerErrorException

use of javax.ws.rs.InternalServerErrorException in project jersey by jersey.

the class AbstractRootElementJaxbProvider method writeTo.

@Override
public final void writeTo(Object t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException {
    try {
        final Marshaller m = getMarshaller(type, mediaType);
        final Charset c = getCharset(mediaType);
        if (c != UTF8) {
            m.setProperty(Marshaller.JAXB_ENCODING, c.name());
        }
        setHeader(m, annotations);
        writeTo(t, mediaType, c, m, entityStream);
    } catch (JAXBException ex) {
        throw new InternalServerErrorException(ex);
    }
}
Also used : Marshaller(javax.xml.bind.Marshaller) JAXBException(javax.xml.bind.JAXBException) Charset(java.nio.charset.Charset) InternalServerErrorException(javax.ws.rs.InternalServerErrorException)

Aggregations

InternalServerErrorException (javax.ws.rs.InternalServerErrorException)36 ApiOperation (io.swagger.annotations.ApiOperation)14 Timed (com.codahale.metrics.annotation.Timed)13 Path (javax.ws.rs.Path)13 GET (javax.ws.rs.GET)9 NotFoundException (javax.ws.rs.NotFoundException)9 IOException (java.io.IOException)8 BadRequestException (javax.ws.rs.BadRequestException)8 Produces (javax.ws.rs.Produces)6 ApiResponses (io.swagger.annotations.ApiResponses)5 POST (javax.ws.rs.POST)5 JAXBException (javax.xml.bind.JAXBException)5 AuditEvent (org.graylog2.audit.jersey.AuditEvent)5 JsonMappingException (com.fasterxml.jackson.databind.JsonMappingException)4 Consumes (javax.ws.rs.Consumes)4 IndexManagementConfig (org.graylog2.indexer.management.IndexManagementConfig)4 SchemaFactoryWrapper (com.fasterxml.jackson.module.jsonSchema.factories.SchemaFactoryWrapper)3 Charset (java.nio.charset.Charset)3 HashMap (java.util.HashMap)3 RequiresPermissions (org.apache.shiro.authz.annotation.RequiresPermissions)3