fi.vm.sade.organisaatio.service.oid.OrganisaatioOIDServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for fi.vm.sade.organisaatio.service.oid.OrganisaatioOIDServiceImpl.java

Source

/*
 * Copyright (c) 2013 The Finnish Board of Education - Opetushallitus
 *
 * This program is free software:  Licensed under the EUPL, Version 1.1 or - as
 * soon as they will be approved by the European Commission - subsequent versions
 * of the EUPL (the "Licence");
 *
 * You may not use this work except in compliance with the Licence.
 * You may obtain a copy of the Licence at: http://www.osor.eu/eupl/
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 */

package fi.vm.sade.organisaatio.service.oid;

import fi.vm.sade.oid.service.ExceptionMessage;
import fi.vm.sade.oid.service.OIDService;
import fi.vm.sade.oid.service.types.NodeClassCode;
import fi.vm.sade.oid.service.types.NodeClassData;
import fi.vm.sade.organisaatio.dao.OrganisaatioDAO;
import fi.vm.sade.organisaatio.dao.YhteystietoArvoDAO;
import fi.vm.sade.organisaatio.dao.YhteystietoDAO;
import fi.vm.sade.organisaatio.dao.YhteystietoElementtiDAO;
import fi.vm.sade.organisaatio.dao.YhteystietojenTyyppiDAO;

import fi.vm.sade.organisaatio.model.Organisaatio;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * Organisaation OID generointi toimii kuin OIDServiceMock, mutta tarkistaa ettei
 * kannassa jo ole generoitua OID:a.
 *
 * Esimerkkej generoiduista OID:sta:
 * <pre>
 * 1.2.246.562.5.2013052409561013582688
 * 1.2.246.562.5.2013052409562689910998
 * </pre>
 *
 * (<a>https://confluence.oph.ware.fi/confluence/display/TD/OID-palvelu</a>)
 *
 * @author simok
 */
public class OrganisaatioOIDServiceImpl implements OIDService {
    private final Logger LOG = LoggerFactory.getLogger(getClass());

    @Autowired
    private OrganisaatioDAO organisaatioDAO;

    @Autowired
    private YhteystietoDAO yhteystietoDAO;

    @Autowired
    private YhteystietoArvoDAO yhteystietoArvoDAO;

    @Autowired
    private YhteystietoElementtiDAO yhteystietoElementtiDAO;

    @Autowired
    private YhteystietojenTyyppiDAO yhteystietojenTyyppiDAO;

    private final String root = "1.2.246.562.";
    private final String[] values = new String[] { "5", "6", "10", "11", "12", "13", "14", "16", "17", "18", "19",
            "20", "22", "24", "27" };
    private final NodeClassCode[] codes = new NodeClassCode[] { NodeClassCode.TEKN_5, NodeClassCode.TEKN_6,
            NodeClassCode.TOIMIPAIKAT, NodeClassCode.ASIAKIRJAT, NodeClassCode.OHJELMISTOT, NodeClassCode.LAITTEET,
            NodeClassCode.PALVELUT, NodeClassCode.LASKUTUS, NodeClassCode.LOGISTIIKKA, NodeClassCode.SANOMALIIKENNE,
            NodeClassCode.REKISTERINPITAJA, NodeClassCode.NAYTETUNNISTE, NodeClassCode.TILAP_ASIAKAS,
            NodeClassCode.HENKILO, NodeClassCode.ROOLI };

    @Override
    public String newOidByClassValue(String nodeClassValue) throws ExceptionMessage {
        return generateOid(nodeClassValue);
    }

    @Override
    public List<NodeClassData> getNodeClasses() throws ExceptionMessage {
        List<NodeClassData> list = new ArrayList<>();

        for (int i = 0; i < values.length; i++) {
            NodeClassData data = new NodeClassData();
            data.setClassCode(codes[i]);
            data.setNodeValue(values[i]);
            data.setDescription(i + "");
            list.add(data);
        }

        return list;
    }

    @Override
    public String newOid(NodeClassCode nodeClass) throws ExceptionMessage {

        int valueIndex = -1;
        for (int i = 0; i < codes.length; ++i) {
            if (codes[i].equals(nodeClass)) {
                valueIndex = i;
                break;
            }
        }
        if (valueIndex < 0) {
            LOG.warn("It seems that there is a new NodeClassCode defined, please update "
                    + this.getClass().getSimpleName() + "! NodeClassCode = " + nodeClass);
            // Generate TEKN_5 oid
            valueIndex = 0;
        }

        return generateOid(values[valueIndex]);
    }

    private String generateOid(String nodeClassValue) {
        LOG.debug("Generating new OID for node class: " + nodeClassValue);
        boolean generateNew = true;
        String newOid = null;

        while (generateNew) {
            newOid = root + nodeClassValue + "." + generateRandom();

            if (oidAvailable(newOid, nodeClassValue)) {
                generateNew = false;
            }
        }

        LOG.debug("New oid generated: " + newOid);
        return newOid;
    }

    private String generateRandom() {

        long min = 1000000000L;
        long max = 10000000000L;

        Random r = new Random();
        long number = min + ((long) (r.nextDouble() * (max - min)));

        String n = Long.toString(number);
        n += luhnChecksum(number);
        return n;
    }

    private int luhnChecksum(Long oid) {
        String oidStr = oid.toString();

        int sum = 0;
        boolean alternate = false;

        for (int i = oidStr.length() - 1; i >= 0; i--) {
            int n = Integer.parseInt(oidStr.substring(i, i + 1));
            if (alternate) {
                n *= 2;
                if (n > 9) {
                    n = (n % 10) + 1;
                }
            }
            sum += n;
            alternate = !alternate;
        }

        return sum % 10;
    }

    private boolean oidAvailable(String oid, String nodeClassValue) {
        NodeClassCode nodeClass = nodeClassValueToCode(nodeClassValue);

        if (nodeClassValue.equals("28") || nodeClass == NodeClassCode.TOIMIPAIKAT) {
            // Organisaation ja ryhmn OID:t lytyvt organisaatio-taulusta
            Organisaatio org = organisaatioDAO.findByOid(oid);

            // Jos organisaatio lytyy annetulla oidilla, niin se ei ole vapaana
            return (org == null) ? true : false;
        } else if (nodeClass == NodeClassCode.TEKN_5) {
            try {
                // Yhteystietoihin liittyvt OID:t lytyvt neljst eri taulusta
                if (yhteystietoDAO.findBy("yhteystietoOid", oid).size() > 0) {
                    return false;
                }
                if (yhteystietoArvoDAO.findBy("yhteystietoArvoOid", oid).size() > 0) {
                    return false;
                }
                if (yhteystietoElementtiDAO.findBy("oid", oid).size() > 0) {
                    return false;
                }
                if (yhteystietojenTyyppiDAO.findBy("oid", oid).size() > 0) {
                    return false;
                }
            } catch (Exception ex) {
                LOG.warn(ex.getMessage());
            }
            // Yhteystietoihin liittyvist tauluista ei lytynyt oidia
            return true;
        }

        LOG.warn("Unknown node class value: " + nodeClassValue);

        return false;
    }

    private NodeClassCode nodeClassValueToCode(String nodeClassValue) {
        int valueIndex = -1;
        for (int i = 0; i < values.length; i++) {
            if (values[i].equals(nodeClassValue)) {
                valueIndex = i;
                break;
            }
        }

        if (valueIndex >= 0) {
            return codes[valueIndex];
        }

        return null;
    }
}