Как добавить тип text/plain MIME в DataHandler

Я некоторое время пытался заставить этот тест работать, соответствующий код отлично работает в производстве, я предполагаю, что он имеет некоторую дополнительную конфигурацию, похоже, что много поиска связано конкретно с обработкой электронной почты и дополнительными библиотеками, я не хочу чтобы включить что-нибудь еще, что мне не хватает, чтобы связать DataHandler с соответствующим способом обработки «текст/обычный»?

Ожидаемый результат: DataHandler позволяет мне передавать входное «Значение» обратно в результат.

Воспроизведите проблему с этим кодом:

import java.io.IOException;
import java.io.InputStream;

import javax.activation.CommandInfo;
import javax.activation.CommandMap;
import javax.activation.DataHandler;
import org.apache.commons.io.IOUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class DataHandlerTest {

    @Before
    public void setUp() throws Exception {
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void test() throws IOException {

        printDefaultCommandMap();
        DataHandler dh = new DataHandler("Value", "text/plain");
        System.out.println("DataHandler commands:");
        printDataHandlerCommands(dh);
        dh.setCommandMap(CommandMap.getDefaultCommandMap());
        System.out.println("DataHandler commands:");
        printDataHandlerCommands(dh);

        final InputStream in = dh.getInputStream();
        String result = new String(IOUtils.toByteArray(in));

        System.out.println("Returned String: " + result);
    }

    private void printDataHandlerCommands(DataHandler dh) {

        CommandInfo[] infos = dh.getAllCommands();
        printCommands(infos);
    }

    private void printDefaultCommandMap() {

        CommandMap currentMap = CommandMap.getDefaultCommandMap();
        String[] mimeTypes = currentMap.getMimeTypes();

        System.out.println("Found " + mimeTypes.length + " MIME types.");
        for (String mimeType : mimeTypes) {
            System.out.println("Commands for: " + mimeType);
            printCommands(currentMap.getAllCommands(mimeType));
        }
    }

    private void printCommands(CommandInfo[] infos) {

        for (CommandInfo info : infos) {
            System.out.println("   Command Class: " +info.getCommandClass());
            System.out.println("   Command Name: " + info.getCommandName());
        }
    }
}

Исключение:

javax.activation.UnsupportedDataTypeException: нет объекта DCH для типа MIME text/plain в javax.activation.DataHandler.getInputStream(DataHandler.java:249)

Помощь высоко ценится, я надеюсь, что это правильно сформулированный вопрос!

========================

Обновление от 25 февраля

Я обнаружил, что если я знаю, что сохранил строку в DataHandler, то я могу привести результат к строке и вернуть объект, который был сохранен, например:

@Test
public void testGetWithoutStream() throws IOException {

    String inputString = "Value";
    DataHandler dh = new DataHandler(inputString, "text/plain");

    String rawResult = (String) dh.getContent();
    assertEquals(inputString, rawResult);
}

Но тестируемый код использует InputStream, поэтому мои «настоящие» тесты по-прежнему не работают при локальном выполнении. Продолжаю свое расследование и все еще надеюсь на чью-то помощь / руководство по этому вопросу...


person Alan Blyth    schedule 24.02.2018    source источник


Ответы (1)


Отвечая на мой собственный вопрос для кого-либо в будущем.

Все заслуги принадлежат: https://community.oracle.com/thread/1675030?start=0

Принцип здесь заключается в том, что вам нужно предоставить DataHandler фабрику, содержащую DataContentHandler, которая будет вести себя так, как вы хотели бы, для вашего типа MIME, установив это с помощью статического метода, который, по-видимому, влияет на все экземпляры DataHandler.

Я объявил новый класс (SystemDataHandlerConfigurator), который имеет единственный общедоступный метод, создающий мою фабрику и предоставляющий ей статическую функцию DataHandler.setDataContentHandlerFactory().

Мои тесты теперь работают правильно, если я делаю это до их запуска:

SystemDataHandlerConfigurator configurator = new SystemDataHandlerConfigurator();
configurator.setupCustomDataContentHandlers();

Конфигуратор SystemDataHandler

import java.io.IOException;
import javax.activation.*;

public class SystemDataHandlerConfigurator {

    public void setupCustomDataContentHandlers() {

        DataHandler.setDataContentHandlerFactory(new CustomDCHFactory());
    }

    private class CustomDCHFactory implements DataContentHandlerFactory {

        @Override
        public DataContentHandler createDataContentHandler(String mimeType) {

            return new BinaryDataHandler();
        }
    }

    private class BinaryDataHandler implements DataContentHandler {

        /** Creates a new instance of BinaryDataHandler */
        public BinaryDataHandler() {

        }

        /** This is the key, it just returns the data uninterpreted. */
        public Object getContent(javax.activation.DataSource dataSource) throws java.io.IOException {

                return dataSource.getInputStream();
        }

        public Object getTransferData(java.awt.datatransfer.DataFlavor dataFlavor, 
                             javax.activation.DataSource dataSource) 
                              throws java.awt.datatransfer.UnsupportedFlavorException, 
       java.io.IOException {

                return null;
        }

        public java.awt.datatransfer.DataFlavor[] getTransferDataFlavors() {

            return new java.awt.datatransfer.DataFlavor[0];
        }

        public void writeTo(Object obj, String mimeType, java.io.OutputStream outputStream) 
         throws java.io.IOException {

                if (mimeType == "text/plain") {
                    byte[] stringByte = (byte[]) ((String) obj).getBytes("UTF-8");
                    outputStream.write(stringByte);
                }
                else {
                    throw new IOException("Unsupported Data Type: " + mimeType);
                }
        }
    }  
}
person Alan Blyth    schedule 25.02.2018