/* * Copyright (C) 2013 Intel Corporation * All rights reserved. */ package com.intel.mtwilson.jaxrs2.provider; import com.intel.mtwilson.jaxrs2.mediatype.CryptoMediaType; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.intel.dcsg.cpg.x509.X509Util; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import java.security.cert.CertificateEncodingException; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.util.List; import javax.ws.rs.Consumes; import javax.ws.rs.Produces; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.ext.MessageBodyReader; import javax.ws.rs.ext.MessageBodyWriter; import javax.ws.rs.ext.Provider; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; //import org.codehaus.jackson.jaxrs.JacksonJsonProvider; /** * Reference: https://jersey.java.net/documentation/latest/message-body-workers.html * * @author jbuhacoff */ @Provider @Consumes({CryptoMediaType.APPLICATION_X_PEM_FILE,MediaType.TEXT_PLAIN}) @Produces({CryptoMediaType.APPLICATION_X_PEM_FILE,MediaType.TEXT_PLAIN}) public class X509CertificateArrayPemProvider implements MessageBodyWriter<X509Certificate[]>, MessageBodyReader<X509Certificate[]> { @Override public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { return X509Certificate[].class.isAssignableFrom(type) && ( mediaType.toString().equals(CryptoMediaType.APPLICATION_X_PEM_FILE) || mediaType.toString().equals(MediaType.TEXT_PLAIN) ); } @Override public long getSize(X509Certificate[] t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { return -1; } @Override public void writeTo(X509Certificate[] t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException { try { String[] pems = new String[t.length]; for(int i=0; i<pems.length; i++) { pems[i] = X509Util.encodePemCertificate(t[i]); } String out = StringUtils.join(pems, "\n"); IOUtils.write(out, entityStream); } catch(CertificateEncodingException e) { throw new IOException(e); } } @Override public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { return X509Certificate[].class.isAssignableFrom(type) && ( mediaType.toString().equals(CryptoMediaType.APPLICATION_X_PEM_FILE) || mediaType.toString().equals(MediaType.TEXT_PLAIN) ); } @Override public X509Certificate[] readFrom(Class<X509Certificate[]> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException, WebApplicationException { try { String pem = IOUtils.toString(entityStream); List<X509Certificate> certs = X509Util.decodePemCertificates(pem); X509Certificate[] array = new X509Certificate[certs.size()]; return certs.toArray(array); } catch(CertificateException e) { throw new IOException(e); } } }