com.b2international.snowowl.snomed.api.impl.domain.AxiomInputCreator.java Source code

Java tutorial

Introduction

Here is the source code for com.b2international.snowowl.snomed.api.impl.domain.AxiomInputCreator.java

Source

/*
 * Copyright 2018 B2i Healthcare Pte Ltd, http://b2i.sg
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.b2international.snowowl.snomed.api.impl.domain;

import org.snomed.otf.owltoolkit.conversion.AxiomRelationshipConversionService;
import org.snomed.otf.owltoolkit.domain.AxiomRepresentation;
import org.snomed.otf.owltoolkit.domain.Relationship;

import com.b2international.snowowl.core.ApplicationContext;
import com.b2international.snowowl.core.branch.Branch;
import com.b2international.snowowl.core.domain.TransactionContext;
import com.b2international.snowowl.core.events.Request;
import com.b2international.snowowl.snomed.SnomedConstants.Concepts;
import com.b2international.snowowl.snomed.api.browser.ISnomedBrowserAxiomService;
import com.b2international.snowowl.snomed.api.domain.browser.ISnomedBrowserAxiom;
import com.b2international.snowowl.snomed.api.domain.browser.ISnomedBrowserRelationship;
import com.b2international.snowowl.snomed.api.impl.domain.browser.SnomedBrowserAxiom;
import com.b2international.snowowl.snomed.common.SnomedRf2Headers;
import com.b2international.snowowl.snomed.datastore.request.SnomedRefSetMemberCreateRequest;
import com.b2international.snowowl.snomed.datastore.request.SnomedRefSetMemberUpdateRequest;
import com.b2international.snowowl.snomed.datastore.request.SnomedRequests;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Multimaps;

public class AxiomInputCreator extends AbstractInputCreator implements
        ComponentInputCreator<SnomedRefSetMemberCreateRequest, SnomedRefSetMemberUpdateRequest, ISnomedBrowserAxiom> {

    private AxiomRelationshipConversionService conversionService;
    private Branch branch;

    public AxiomInputCreator(final Branch branch) {
        this.branch = branch;
    }

    @Override
    public SnomedRefSetMemberCreateRequest createInput(final ISnomedBrowserAxiom newAxiom,
            final InputFactory inputFactory) {
        if (newAxiom.getAxiomId() == null) {
            final SnomedBrowserAxiom browserAxiom = (SnomedBrowserAxiom) newAxiom;
            return (SnomedRefSetMemberCreateRequest) SnomedRequests.prepareNewMember()
                    .setModuleId(browserAxiom.getModuleId()).setReferenceSetId(Concepts.REFSET_OWL_AXIOM)
                    .setReferencedComponentId(browserAxiom.getReferencedComponentId())
                    .setProperties(ImmutableMap.<String, Object>of(SnomedRf2Headers.FIELD_OWL_EXPRESSION,
                            toOwlExpression(browserAxiom)))
                    .build();
        }
        return null;
    }

    @Override
    public SnomedRefSetMemberUpdateRequest createUpdate(final ISnomedBrowserAxiom existingAxiom,
            final ISnomedBrowserAxiom updatedAxiom) {
        if (updatedAxiom.getAxiomId() != null) {

            final SnomedBrowserAxiom updatedBrowserAxiom = (SnomedBrowserAxiom) updatedAxiom;

            return (SnomedRefSetMemberUpdateRequest) SnomedRequests.prepareUpdateMember()
                    .setMemberId(updatedBrowserAxiom.getAxiomId())
                    .setSource(ImmutableMap.<String, Object>builder()
                            .put(SnomedRf2Headers.FIELD_ACTIVE, updatedBrowserAxiom.isActive())
                            .put(SnomedRf2Headers.FIELD_MODULE_ID, updatedBrowserAxiom.getModuleId())
                            .put(SnomedRf2Headers.FIELD_OWL_EXPRESSION, toOwlExpression(updatedBrowserAxiom))
                            .build())
                    .build();

        }

        return null;
    }

    @Override
    public boolean canCreateInput(final Class<? extends Request<TransactionContext, String>> inputType) {
        return SnomedRefSetMemberCreateRequest.class.isAssignableFrom(inputType);
    }

    @Override
    public boolean canCreateUpdate(final Class<? extends Request<TransactionContext, Boolean>> updateType) {
        return SnomedRefSetMemberUpdateRequest.class.isAssignableFrom(updateType);
    }

    private String toOwlExpression(final SnomedBrowserAxiom browserAxiom) {

        final ListMultimap<Integer, Relationship> relationships = ArrayListMultimap.create();
        for (final ISnomedBrowserRelationship relationship : browserAxiom.getRelationships()) {
            final long typeId = Long.valueOf(relationship.getType().getConceptId());
            final long targetId = Long.valueOf(relationship.getTarget().getConceptId());
            relationships.put(relationship.getGroupId(),
                    new Relationship(relationship.getGroupId(), typeId, targetId));
        }

        final AxiomRepresentation axiomRepresentation = new AxiomRepresentation();
        axiomRepresentation.setPrimitive(browserAxiom.getDefinitionStatus().isPrimitive());

        final Long conceptId = Long.valueOf(browserAxiom.getReferencedComponentId());

        if (browserAxiom.isNamedConceptOnLeft()) {
            axiomRepresentation.setLeftHandSideNamedConcept(conceptId);
            axiomRepresentation.setRightHandSideRelationships(Multimaps.asMap(relationships));
        } else {
            axiomRepresentation.setRightHandSideNamedConcept(conceptId);
            axiomRepresentation.setLeftHandSideRelationships(Multimaps.asMap(relationships));
        }

        return getConversionService().convertRelationshipsToAxiom(axiomRepresentation);
    }

    public AxiomRelationshipConversionService getConversionService() {
        if (conversionService == null) {
            conversionService = ApplicationContext.getServiceForClass(ISnomedBrowserAxiomService.class)
                    .getConversionService(branch.path());
        }
        return conversionService;
    }

}