HAPI - пользовательский класс модели, который также является каноническим?

У меня есть приложение, которое в настоящее время использует настраиваемую модель с настраиваемыми типами сообщений и классами 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, когда я пытаюсь проанализировать сообщение в моем классе v2.5 DFT_P03. Я прочитал всю информацию, которую смог найти об этом, и, к сожалению, никто из них не использовал ее вместе с 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 при попытке проанализировать что-либо еще, кроме сообщения V2.5 DFT.

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

Спасибо!


person Martin    schedule 04.07.2019    source источник


Ответы (1)


мы нашли способ объединить эти два поведения.

public class CustomModelCanonicalClassFactory extends CustomModelClassFactory {
private String customVersion;

   public CustomModelCanonicalClassFactory(String packageName, String version){
        super(packageName);
        if (version == null || !Version.supportsVersion(version)) {
            throw new IllegalArgumentException("Unknown version: " + version);
        }
        this.customVersion = version;
    }

}

затем переопределите все необходимые вам методы, дайте явную версию методу super #


    @Override
    public Class<? extends Message> getMessageClass(String name, String version, boolean isExplicit) throws HL7Exception {
        return super.getMessageClass(name, this.customVersion, isExplicit);
    }

    @Override
    public Class<? extends Group> getGroupClass(String name, String version) throws HL7Exception {
        return super.getGroupClass(name, this.customVersion);
    }

С уважением, Патрик

person Patrick Höhle    schedule 06.05.2020
comment
У вас НЕТ ИДЕИ, как давно у меня это было в моем списке дел! Это работает как шарм, я отправил сообщение версии 2.4, и он обработал его как босс. БЛАГОДАРЮ ВАС! - person Martin; 06.05.2020