package art.servers.transactionsserver.model.objects; import art.library.interop.InteropParameters; import art.library.interop.InteropResponse; import art.library.interop.serialization.SerializationException; import art.library.model.transactions.scheduler.ScheduledTask; import art.library.model.transactions.scheduler.ScheduledTaskProcedureInterval; import art.library.persistence.Persistence; import static art.servers.controller.ListenerImplementation.getTimestamp; import art.servers.transactionsserver.Shared; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; public class ModelCrudObject { public ModelCrudObject() { } /** * * @param parameters * String language * String classname * @return * @throws SerializationException */ @SuppressWarnings("unchecked") public InteropResponse getObjectsFolders(InteropParameters parameters) throws SerializationException { String language = parameters.hasParameter("language") ? (String) parameters.getParameterValue("language") : art.servers.Shared.getLanguage(); Set lfolder = new HashSet<>(); try { String classname = (parameters.hasParameter("classname") == true) ? (String) parameters.getParameterValue("classname") : null; List lobject = Shared.controllerDatabase.getTimelessPersistance().get(0).getObject(classname); lfolder = lobject.stream().map(o -> (String) getValue(o, "folder")).collect(Collectors.toSet()); return new InteropResponse(lfolder.toArray(new String[0])); } catch (Exception exception) { throw new SerializationException(Shared.getMessage(language, exception.getMessage()), exception); } } /** * * @param parameters * String language * String classname * String folder * String name * Empty name_like/null * @return * @throws SerializationException */ @SuppressWarnings("unchecked") public InteropResponse getObjects(InteropParameters parameters) throws SerializationException { String language = parameters.hasParameter("language") ? (String) parameters.getParameterValue("language") : art.servers.Shared.getLanguage(); List lobject = new ArrayList<>(); try { String classname = (parameters.hasParameter("classname") == true) ? (String) parameters.getParameterValue("classname") : null; String folder = (parameters.hasParameter("folder") == true) ? ((String) parameters.getParameterValue("folder")).replace("'", "''") : null; boolean FOLDER_LIKE = parameters.hasParameter("folder_like"); String name = (parameters.hasParameter("name") == true) ? ((String) parameters.getParameterValue("name")).replace("'", "''") : null; boolean NAME_LIKE = parameters.hasParameter("name_like"); boolean SUMMARY = parameters.hasParameter("summary"); long from = parameters.hasParameter("from") ? getTimestamp(parameters.getParameterValue("from")) : 0L; long to = parameters.hasParameter("to") ? getTimestamp(parameters.getParameterValue("to")) : System.currentTimeMillis(); String where = "true"; if (folder != null || name != null) { if ((folder != null) && (!folder.isEmpty())) { if (FOLDER_LIKE) where += " and (folder='" + folder + "' or folder like '" + folder + "/%')"; else where += " and folder='" + folder + "'"; } if (name != null) { if (NAME_LIKE) where += " and name like '%" + name + "%'"; else where += " and name='" + name + "'"; } if (SUMMARY) lobject = Shared.controllerDatabase.getTimelessPersistance().get(0).getObjectSummary(classname, where); else lobject = Shared.controllerDatabase.getTimelessPersistance().get(0).getObject(classname, where); } else { if (SUMMARY) lobject = Shared.controllerDatabase.getTimelessPersistance().get(0).getObjectSummary(classname); else lobject = Shared.controllerDatabase.getTimelessPersistance().get(0).getObject(classname); } return new InteropResponse(lobject.toArray(new Object[0])); } catch (Exception exception) { exception.printStackTrace(); throw new SerializationException(Shared.getMessage(language, exception.getMessage()), exception); } } /** * * @param parameters * String language * String classname * String folder * String name * Empty name_like/null * @return * @throws SerializationException */ @SuppressWarnings("unchecked") public InteropResponse getScheduledTasks(InteropParameters parameters) throws SerializationException { String language = parameters.hasParameter("language") ? (String) parameters.getParameterValue("language") : art.servers.Shared.getLanguage(); List lobject = new ArrayList(); try { String folder = (parameters.hasParameter("folder") == true) ? (String) parameters.getParameterValue("folder") : null; boolean FOLDER_LIKE = parameters.hasParameter("folder_like"); String name = (parameters.hasParameter("name") == true) ? (String)parameters.getParameterValue("name") : null; boolean NAME_LIKE = parameters.hasParameter("name_like"); boolean SUMMARY = parameters.hasParameter("summary"); long from = parameters.hasParameter("from") ? getTimestamp(parameters.getParameterValue("from")) : 0L; long to = parameters.hasParameter("to") ? getTimestamp(parameters.getParameterValue("to")) : System.currentTimeMillis(); String where = "true"; if (folder != null || name != null) { if ((folder != null) && (!folder.isEmpty())) { if (FOLDER_LIKE) where += " and (folder='" + folder + "' or folder like '" + folder + "/%')"; else where += " and folder='" + folder + "'"; } if (name != null) { if (NAME_LIKE) where += " and name like '%" + name + "%'"; else where += " and name='" + name + "'"; } if (SUMMARY) lobject = Shared.controllerDatabase.getTimelessPersistance().get(0).getObjectSummary(ScheduledTask.class.getName(), where); else lobject = Shared.controllerDatabase.getTimelessPersistance().get(0).getObject(ScheduledTask.class.getName(), where); } else { if (SUMMARY) lobject = Shared.controllerDatabase.getTimelessPersistance().get(0).getObjectSummary(ScheduledTask.class.getName()); else lobject = Shared.controllerDatabase.getTimelessPersistance().get(0).getObject(ScheduledTask.class.getName()); } List lresult = new ArrayList(); for (Object object : lobject) { ScheduledTask task = (ScheduledTask)object; if (task.scheduledTask.specificTimestamp > 0) { if ((from <= task.scheduledTask.specificTimestamp) && (task.scheduledTask.specificTimestamp <= to)) { lresult.add(task); } } else { if (task.scheduledTask != null) { if ((task.scheduledTask.weekly != null) && (task.scheduledTask.weekly.size() > 0)) { for (ScheduledTaskProcedureInterval weekly : task.scheduledTask.weekly) { if (((from <= weekly.from) && (weekly.from <= to)) && ((from <= weekly.to) && (weekly.to <= to))) { lresult.add(task); break; } } } else { ScheduledTaskProcedureInterval interval = null; if (task.scheduledTask.interval != null) interval = task.scheduledTask.interval; if (task.scheduledTask.monthly != null) interval = task.scheduledTask.monthly; if (interval != null) { if (((from <= interval.from) && (interval.from <= to)) && ((from <= interval.to) && (interval.to <= to))) { lresult.add(task); } } } } } } return new InteropResponse(lresult.toArray(new ScheduledTask[0])); } catch (Exception exception) { throw new SerializationException(Shared.getMessage(language, exception.getMessage()), exception); } } /** * * @param parameters * String language * BodyContent Object[].class * @return * @throws SerializationException */ public InteropResponse addObject(InteropParameters parameters) throws SerializationException { String language = parameters.hasParameter("language") ? (String) parameters.getParameterValue("language") : art.servers.Shared.getLanguage(); AtomicBoolean success = new AtomicBoolean(true); try { String classname = (parameters.hasParameter("classname") == true) ? (String) parameters.getParameterValue("classname") : null; if (classname.contains("[L")) { Object lobject[] = parameters.getBodyContentValue(classname); Arrays.stream(lobject).forEach(o -> { try { addObject(language, o); } catch (Exception ex) { success.set(false); Logger.getLogger(ModelCrudObject.class.getName()).log(Level.SEVERE, null, ex); } }); } else { addObject(language, parameters.getBodyContentValue(classname)); } } catch (Exception exception) { throw new SerializationException(Shared.getMessage(language, exception.getMessage()), exception); } return new InteropResponse(new Boolean(success.get())); } public InteropResponse addHistoricalObject(InteropParameters parameters) throws SerializationException { String language = parameters.hasParameter("language") ? (String) parameters.getParameterValue("language") : art.servers.Shared.getLanguage(); AtomicBoolean success = new AtomicBoolean(true); try { String classname = (parameters.hasParameter("classname") == true) ? (String) parameters.getParameterValue("classname") : null; addHistoricalObject(language, parameters.getBodyContentValue(classname)); } catch (Exception exception) { throw new SerializationException(Shared.getMessage(language, exception.getMessage()), exception); } return new InteropResponse(new Boolean(success.get())); } private void addObject(String language, Object o) throws Exception { try { if (getValue(o, "folder") == null) { setValue(o, "folder", ""); } Shared.controllerDatabase.getTimelessPersistance().get(0).updateOrAddObject(o); } catch (Exception exception) { throw new SerializationException(Shared.getMessage(language, exception.getMessage()), exception); } } private void addHistoricalObject(String language, Object o) throws Exception { try { Shared.controllerDatabase.getHistoricalPersistance().get(0).updateOrAddObject(o); } catch (Exception exception) { throw new SerializationException(Shared.getMessage(language, exception.getMessage()), exception); } } /** * * @param parameters * String language * BodyContent Object[].class * @return * @throws SerializationException */ public InteropResponse removeObject(InteropParameters parameters) throws SerializationException { String language = parameters.hasParameter("language") ? (String) parameters.getParameterValue("language") : art.servers.Shared.getLanguage(); AtomicBoolean success = new AtomicBoolean(true); try { String classname = (parameters.hasParameter("classname") == true) ? (String) parameters.getParameterValue("classname") : null; Object lobject[] = parameters.getBodyContentValue(classname); Arrays.stream(lobject).forEach(o -> { try { if (getValue(o, "folder") == null) setValue(o, "folder", ""); Shared.controllerDatabase.getTimelessPersistance().get(0).deleteObject(o); } catch (Exception ex) { success.set(false); ex.printStackTrace(); } }); } catch (Exception exception) { throw new SerializationException(art.servers.Shared.getMessage(language, exception.getMessage()), exception); } return new InteropResponse(new Boolean(success.get())); } /** * * @param parameters * String language * String classname * String previousFolder * String newFolder * @return * @throws SerializationException */ @SuppressWarnings("unchecked") public InteropResponse renameObjectFolder(InteropParameters parameters) throws SerializationException { String language = parameters.hasParameter("language") ? (String) parameters.getParameterValue("language") : art.servers.Shared.getLanguage(); boolean success = true; try { String classname = (parameters.hasParameter("classname") == true) ? (String) parameters.getParameterValue("classname") : null; String previousFolder = ((parameters.hasParameter("previousFolder") == true) && !((String) parameters.getParameterValue("previousFolder")).isEmpty()) ? (String) parameters.getParameterValue("previousFolder") : ""; String newFolder = ((parameters.hasParameter("newFolder") == true) && !((String) parameters.getParameterValue("newFolder")).isEmpty()) ? (String) parameters.getParameterValue("newFolder") : ""; String where = "(folder = '" + previousFolder + "' or folder like '" + previousFolder + "/%')"; List lobject = (List) (List) Shared.controllerDatabase.getTimelessPersistance().get(0).getObject(classname, where); for (Object object : lobject) { try { Shared.controllerDatabase.getTimelessPersistance().get(0).deleteObject(object); setValue(object, "folder", newFolder); Shared.controllerDatabase.getTimelessPersistance().get(0).addObject_asynchronous(object); } catch (Exception e) { success = false; } } return new InteropResponse(success); } catch (Exception exception) { throw new SerializationException(Shared.getMessage(language, exception.getMessage()), exception); } } private void setValue(Object object, String field, String value) { try { Field folderField = object.getClass().getDeclaredField(field); folderField.set(object, value); } catch (Exception e) { e.printStackTrace(); } } private Object getValue(Object object, String field) { try { Field folderField = object.getClass().getDeclaredField(field); return folderField.get(object); } catch (Exception e) { e.printStackTrace(); } return new Object(); } }