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;
}
}