ImportUser.java

package com.workbenchclassic;

import org.json.JSONArray;
import org.json.JSONObject;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Map;
import java.util.stream.Collectors;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@Path("/importUser")
public class ImportUser {
    
    private JSONObject normalizeCI(JSONObject src) {
    JSONObject dst = new JSONObject();
    src.keySet().forEach(k ->
        dst.put(k.toLowerCase(), src.opt(k))
    );
    return dst;
}

private String getString(JSONObject obj, UserField field) {
    Object v = obj.opt(field.key());
    return v == null ? "" : String.valueOf(v);
}

private int getInt(JSONObject obj, UserField field) {
    Object v = obj.opt(field.key());
    if (v instanceof Number) {
        return ((Number) v).intValue();
    }
    try {
        return v == null ? 0 : Integer.parseInt(v.toString());
    } catch (NumberFormatException e) {
        return 0;
    }
}


    private final DBService dbService = new DBService("dsTranNJTA");

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response doUpdate(String jsonBody) {
        try {
            JSONObject json = new JSONObject(jsonBody);
            String station = json.getString("station");
            JSONArray dataArray = json.getJSONArray("data");

            String vendor = dbService.getDatabaseProductName();
            System.out.println("Aktueller DB-Vendor: " + vendor);

            Connection conn = dbService.getConnection();

            GetMetadata metadata = new GetMetadata();
            String extPlantResponseString = metadata.getExtPlantJson(station);
            JSONObject extPlantResponse = new JSONObject(extPlantResponseString);

            String errorCode = extPlantResponse.optString("errorCode", "0");
            if (!"0".equals(errorCode)) {
                // Return an HTTP 400 or 500 with that JSON
                return Response.status(Response.Status.BAD_REQUEST).entity(extPlantResponse.toString()).build();
            }
            // 3) werknummer ermitteln

            // werkResultJson könnte z.B. so aussehen:

            String werkData = extPlantResponse.optString("data", "[]");
            JSONArray werkArr = new JSONArray(werkData);

            String WERK_NR = null;
            String COMPANY_NO = null;
            String CLIENT_NO = null;
            if (werkArr.length() > 0) {
                JSONObject row = werkArr.getJSONObject(0);
                WERK_NR = row.optString("ext_company_nr", null);
                COMPANY_NO = row.optString("werk_nr", null);
                CLIENT_NO = row.optString("client_nr", null);
            }

            System.out.println("Ermittelte werknummer: " + COMPANY_NO);

            boolean isMSSQL = "Microsoft SQL Server".equals(vendor);
            boolean isOracle = "Oracle".equals(vendor);

            insertIdocStatus(conn, isMSSQL, isOracle);

            conn.setAutoCommit(false);
            try {
                for (int i = 0; i < dataArray.length(); i++) {
                    JSONObject obj = dataArray.getJSONObject(i);
                    Map<String, String> keyMap = obj.keySet().stream()
                            .collect(Collectors.toMap(String::toLowerCase, key -> key,
                                    (existing, replacement) -> existing));
                    insertUser(conn, obj, COMPANY_NO, WERK_NR, CLIENT_NO, isMSSQL, isOracle, keyMap);

                }
                conn.commit();
            } catch (SQLException e) {
                conn.rollback();
                throw e;
            } finally {
                conn.setAutoCommit(true);
                conn.close();
            }

            JSONObject response = new JSONObject();
            response.put("status", "ok");
            response.put("message", "Daten wurden erfolgreich verarbeitet.");
            return Response.ok(response.toString()).build();

        } catch (Exception e) {
            e.printStackTrace();
            JSONObject error = new JSONObject();
            error.put("status", "error");
            error.put("message", e.getMessage());
            return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(error.toString()).build();
        }
    }

    private void insertUser(Connection conn, JSONObject obj, String COMPANY_NO, String PLANT_NO, String CLIENT_NO,
            boolean isMSSQL, boolean isOracle, Map<String, String> keyMap) throws SQLException {
        String sql;
        if (isMSSQL) {
            sql = "INSERT INTO xtran.tran_user (" +
                    "IDOC_ID, USER_ID, USER_NAME, USER_FIRSTNAME, DESCRIPTION, COSTCENTER, COSTCENTERDESC, " +
                    "PASSWORD, TEAM, PLANT_NO, COMPANY_NO, CLIENT_NO, PERS_NO, USER_STATE, STAMP, CREATED, " +
                    "SOURCE, STATUS, SKILL, EXTERNAL_ID, ERROR_TEXT, ATTRIB_ID, SKILL_USAGE_ID, USER_TOKEN, " +
                    "PASSWORD_HASH, GENDER, APS_TRANSFER) " +
                    "VALUES ((SELECT MAX(id) FROM xtran.tran_idocstatus), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, GETDATE(), GETDATE(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        } else if (isOracle) {
            sql = "INSERT INTO tran.tran_user (" +
                    "IDOC_ID, USER_ID, USER_NAME, USER_FIRSTNAME, DESCRIPTION, COSTCENTER, COSTCENTERDESC, " +
                    "PASSWORD, TEAM, PLANT_NO, COMPANY_NO, CLIENT_NO, PERS_NO, USER_STATE, STAMP, CREATED, " +
                    "SOURCE, STATUS, SKILL, EXTERNAL_ID, ERROR_TEXT, ATTRIB_ID, SKILL_USAGE_ID, USER_TOKEN, " +
                    "PASSWORD_HASH, GENDER, APS_TRANSFER) " +
                    "VALUES ((SELECT MAX(id) FROM tran.tran_idocstatus), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, SYSDATE, SYSDATE, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        } else {
            throw new SQLException("DB-Vendor nicht implementiert");
        }

        try (PreparedStatement ps = conn.prepareStatement(sql)) {
        ps.setString(1,  getString(obj, UserField.USER_ID));
        ps.setString(2,  getString(obj, UserField.USER_NAME));
        ps.setString(3,  getString(obj, UserField.USER_FIRSTNAME));
        ps.setString(4,  getString(obj, UserField.DESCRIPTION));
        ps.setString(5,  getString(obj, UserField.COSTCENTER));
        ps.setString(6,  getString(obj, UserField.COSTCENTERDESC));
        ps.setString(7,  getString(obj, UserField.PASSWORD));
        ps.setString(8,  getString(obj, UserField.TEAM));

        ps.setString(9,  PLANT_NO);
        ps.setString(10, COMPANY_NO);
        ps.setString(11, CLIENT_NO);

        ps.setString(12, getString(obj, UserField.PERS_NO));
        ps.setInt(13,    getInt(obj, UserField.USER_STATE));

        ps.setInt(14,    getInt(obj, UserField.SOURCE));
        ps.setInt(15,    getInt(obj, UserField.STATUS));

        ps.setString(16, getString(obj, UserField.SKILL));
        ps.setString(17, getString(obj, UserField.EXTERNAL_ID));
        ps.setString(18, getString(obj, UserField.ERROR_TEXT));

        ps.setInt(19,    getInt(obj, UserField.ATTRIB_ID));
        ps.setInt(20,    getInt(obj, UserField.SKILL_USAGE_ID));

        ps.setString(21, getString(obj, UserField.USER_TOKEN));
        ps.setString(22, getString(obj, UserField.PASSWORD_HASH));
        ps.setString(23, getString(obj, UserField.GENDER));

        ps.setInt(24,    getInt(obj, UserField.APS_TRANSFER));


            ps.executeUpdate();
        }
    }

    private void insertIdocStatus(Connection conn, boolean isMSSQL, boolean isOracle) throws SQLException {
        String sql;
        if (isMSSQL) {
            sql = "INSERT INTO xtran.tran_idocstatus (ID, DATE_CREATION, ewstatus, errorcode, content_type, source) VALUES (NEXT VALUE FOR xtran.seq_tranidocstatus, GETDATE(), 1, 0, 22, 0)";
        } else if (isOracle) {
            sql = "INSERT INTO tran.tran_idocstatus (ID, DATE_CREATION, ewstatus, errorcode, content_type, source) VALUES (tran.seq_tranidocstatus.nextval, SYSDATE, 1, 0, 22, 0)";
        } else {
            throw new SQLException("DB-Vendor nicht implementiert");
        }
        try (PreparedStatement ps = conn.prepareStatement(sql)) {
            ps.executeUpdate();
        }
    }

}
 enum UserField {

    USER_ID,
    USER_NAME,
    USER_FIRSTNAME,
    DESCRIPTION,
    COSTCENTER,
    COSTCENTERDESC,
    PASSWORD,
    TEAM,
    PERS_NO,
    USER_STATE,
    SOURCE,
    STATUS,
    SKILL,
    EXTERNAL_ID,
    ERROR_TEXT,
    ATTRIB_ID,
    SKILL_USAGE_ID,
    USER_TOKEN,
    PASSWORD_HASH,
    GENDER,
    APS_TRANSFER;

    private final String jsonKey;

    UserField() {
        this.jsonKey = name().toLowerCase();
    }

    public String key() {
        return jsonKey;
    }
}