/** * Вставляет в базу заполненный клиентом объект в начальном статусе. * * @param instance - заполненный экземпляр объекта * @return - идентификатор созданного объекта. */ public Long createInstance(Instance instance) { ArgumentsChecker.notNull(new Argument("instance", instance)); try (Database database = new Database(data)) { ru.skycelot.plicanterra.metamodel.transfer.Template template = findTemplate(instance.template); checkStatusForSameness(instance.status, template.status, template.code); instance.id = database.getNextInstanceSequenceValue(); database.saveTemplateCodeOfInstance(instance.id, instance.template.code); instance.version = 1L; InsertQuery query = new InsertQuery(instance.template.code); query.addInlineColumn("ID", instance.id); query.addInlineColumn("STATUS_ID", template.status.id); query.addInlineColumn("VERSION", instance.version); processAttributes(instance.attributes, template, query); List<InsertQuery> joinLinks = new LinkedList<>(); List<UpdateQuery> referencedLinks = new LinkedList<>(); processLinks(instance.links, template, query, joinLinks, referencedLinks, instance.id); database.execute(query); for (InsertQuery linkQuery : joinLinks) { database.execute(linkQuery); } for (UpdateQuery linkQuery : referencedLinks) { database.execute(linkQuery); } return instance.id; } catch (IOException e) { throw new RuntimeException(e); } }
private ru.skycelot.plicanterra.metamodel.transfer.Template findTemplate(Template template) { ArgumentsChecker.notNull(new Argument("template", template)); ru.skycelot.plicanterra.metamodel.transfer.Template result; if (template.id != null) { result = metamodel.getTemplate(template.id); } else if (template.code != null) { result = metamodel.getTemplate(template.code); } else { throw new IllegalArgumentException("Template id or code is not specified!"); } return result; }