HAPI - Пользовательский класс модели, который также является каноническим? - PullRequest
0 голосов
/ 04 июля 2019

У меня есть приложение, которое в настоящее время использует пользовательскую модель с пользовательскими типами сообщений и классами Z-сегментов. Например, у меня есть класс DFT_P03 в моем пакете v25, который расширяет AbstractMessage и объявляет сегменты, также в том же пакете, как таковой:

private void init(ModelClassFactory factory) 
{
    try 
    {
        this.add(MSH.class, true, false);
        this.add(PID.class, false, false);
        this.add(PV1.class, false, false);
        this.add(FT1.class, false, false);
        this.add(ZPM.class, false, false);
    } 
    catch (HL7Exception e) 
    {}
}

Вот как я создаю свой HapiContext, который указывает на этот же пакет:

public void initializeHAPI()
{
    try
    {
        ModelClassFactory cmf = new CustomModelClassFactory("com.somepackage.somelibraryname.hl7.custommodel");

        MinLowerLayerProtocol mllp = new MinLowerLayerProtocol();
        mllp.setCharset(StandardCharsets.ISO_8859_1.name());

        hapiContext = new DefaultHapiContext();
        hapiContext.setValidationContext(ValidationContextFactory.noValidation());
        hapiContext.getPipeParser().getParserConfiguration().setUnexpectedSegmentBehaviour(UnexpectedSegmentBehaviourEnum.ADD_INLINE);
        hapiContext.setModelClassFactory(cmf);
        hapiContext.setLowerLayerProtocol(mllp);

        logEntryService.logInfo(LogEntrySource.SERVICE, LogEntryType.CORE, "Successfully initialized HAPI framework", logger);
    }
    catch (Exception ex)
    {
        logEntryService.logError(LogEntrySource.SERVICE, LogEntryType.CORE, "Error initializing HAPI framework : " 
            + ex.getMessage(), logger);
    }
}

Пока я отправляю сообщения с 2.5 в MSH.12, все работает без нареканий. Я хотел бы интегрировать CanonicalModelClassFactory в это, чтобы он мог анализировать более низкие версии как сообщения v2.5, не вызывая исключение ClassCastException, когда я пытаюсь проанализировать сообщение в моем классе DFT_P03 v2.5. Я прочитал всю информацию, которую смог найти по этому поводу, и, к сожалению, никто из них не использовал ее вместе с CustomModelClassFactory.

Я фактически создал свой собственный класс CustomModelClassFactory, который расширяет CanonicalClassModelFactory, и изменил цепочку конструктора следующим образом:

public CustomModelClassFactory() 
{
    this((Map<String, String[]>)null);
}

public CustomModelClassFactory(String packageName) 
{
    this(new HashMap<String, String[]>());

    if (!packageName.endsWith(".")) 
    {
        packageName += ".";
    }
    for (Version v : Version.values()) 
    {
        addModel(v.getVersion(), new String[] {packageName + v.getPackageVersion()});
    }
}

public CustomModelClassFactory(Map<String, String[]> map) 
{
    this(new CanonicalModelClassFactory("2.5"), map);
}

public CustomModelClassFactory(ModelClassFactory defaultFactory, Map<String, String[]> map) 
{
    super("2.5");

    this.delegate = defaultFactory;
    customModelClasses = map;
}    

Обратите внимание, что для модели делегата задано значение CanonicalModelClassFactory и вызов super ("2.5"). К сожалению, это все еще вызывает исключение ClassCastException при попытке проанализировать что-либо еще, кроме сообщения DFT v2.5.

Есть идеи, как объединить эти два поведения вместе?

Спасибо!

...