package com.constellio.sdk.dev.tools;
import com.constellio.app.modules.es.model.connectors.ConnectorInstance;
import com.constellio.app.modules.es.model.connectors.ConnectorType;
import com.constellio.app.modules.es.model.connectors.http.ConnectorHttpDocument;
import com.constellio.app.modules.es.model.connectors.http.ConnectorHttpInstance;
import com.constellio.app.modules.es.model.connectors.ldap.ConnectorLDAPInstance;
import com.constellio.app.modules.es.model.connectors.ldap.ConnectorLDAPUserDocument;
import com.constellio.app.modules.es.model.connectors.smb.ConnectorSmbDocument;
import com.constellio.app.modules.es.model.connectors.smb.ConnectorSmbFolder;
import com.constellio.app.modules.es.model.connectors.smb.ConnectorSmbInstance;
import com.constellio.app.modules.reports.wrapper.Printable;
import com.constellio.app.modules.rm.wrappers.*;
import com.constellio.app.modules.rm.wrappers.type.DocumentType;
import com.constellio.app.modules.rm.wrappers.type.FolderType;
import com.constellio.model.entities.records.wrappers.SolrAuthorizationDetails;
import com.constellio.app.modules.robots.model.wrappers.ActionParameters;
import com.constellio.app.modules.robots.model.wrappers.Robot;
import com.constellio.app.modules.robots.model.wrappers.RobotLog;
import com.constellio.app.modules.tasks.model.wrappers.Task;
import com.constellio.app.modules.tasks.model.wrappers.types.TaskStatus;
import com.constellio.model.entities.records.wrappers.*;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.entities.schemas.MetadataSchemaType;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.entities.security.global.SolrGlobalGroup;
import com.constellio.model.entities.security.global.SolrUserCredential;
import com.constellio.model.services.schemas.SchemaUtils;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.annotations.MainTest;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;
@MainTest
public class GenerateHelperClassAcceptTest extends ConstellioTest {
@Test
public void generateRobotsSchemas()
throws Exception {
givenCollection(zeCollection).withRobotsModule();
Map<String, Class<? extends RecordWrapper>> wrappers = new HashMap<>();
wrappers.put(ActionParameters.DEFAULT_SCHEMA, ActionParameters.class);
wrappers.put(Robot.DEFAULT_SCHEMA, Robot.class);
wrappers.put(RobotLog.DEFAULT_SCHEMA, RobotLog.class);
System.out.println(header());
printGeneratedSchemas(wrappers, true);
System.out.println(footer());
}
@Test
public void generateCoreSchemas()
throws Exception {
givenCollection(zeCollection);
Map<String, Class<? extends RecordWrapper>> wrappers = new HashMap<>();
wrappers.put(User.DEFAULT_SCHEMA, User.class);
wrappers.put(Group.DEFAULT_SCHEMA, Group.class);
wrappers.put(SolrUserCredential.DEFAULT_SCHEMA, SolrUserCredential.class);
wrappers.put(SolrGlobalGroup.DEFAULT_SCHEMA, SolrGlobalGroup.class);
wrappers.put(Event.DEFAULT_SCHEMA, Event.class);
wrappers.put(Collection.DEFAULT_SCHEMA, Collection.class);
wrappers.put(EmailToSend.DEFAULT_SCHEMA, EmailToSend.class);
wrappers.put(Facet.DEFAULT_SCHEMA, Facet.class);
wrappers.put(UserDocument.DEFAULT_SCHEMA, UserDocument.class);
wrappers.put(SolrAuthorizationDetails.DEFAULT_SCHEMA, SolrAuthorizationDetails.class);
wrappers.put(Printable.DEFAULT_SCHEMA, Printable.class);
wrappers.put(UserFolder.DEFAULT_SCHEMA, UserFolder.class);
System.out.println(header());
printGeneratedSchemas(wrappers, false);
System.out.println(footer());
}
@Test
public void generateRMSchemas()
throws Exception {
givenCollection(zeCollection).withConstellioRMModule();
Map<String, Class<? extends RecordWrapper>> wrappers = new HashMap<>();
wrappers.put(AdministrativeUnit.DEFAULT_SCHEMA, AdministrativeUnit.class);
wrappers.put(Category.DEFAULT_SCHEMA, Category.class);
wrappers.put(UniformSubdivision.DEFAULT_SCHEMA, UniformSubdivision.class);
wrappers.put(DecommissioningList.DEFAULT_SCHEMA, DecommissioningList.class);
wrappers.put(Cart.DEFAULT_SCHEMA, Cart.class);
wrappers.put(RetentionRule.DEFAULT_SCHEMA, RetentionRule.class);
wrappers.put(Folder.DEFAULT_SCHEMA, Folder.class);
wrappers.put(Document.DEFAULT_SCHEMA, Document.class);
wrappers.put(Email.SCHEMA, Email.class);
wrappers.put(DocumentType.DEFAULT_SCHEMA, DocumentType.class);
wrappers.put(FolderType.DEFAULT_SCHEMA, FolderType.class);
wrappers.put(ContainerRecord.DEFAULT_SCHEMA, ContainerRecord.class);
wrappers.put(StorageSpace.DEFAULT_SCHEMA, StorageSpace.class);
wrappers.put(PrintableLabel.SCHEMA_NAME, PrintableLabel.class);
wrappers.put(RMUserFolder.DEFAULT_SCHEMA, RMUserFolder.class);
wrappers.put(RMTask.DEFAULT_SCHEMA, RMTask.class);
System.out.println(header());
printGeneratedSchemas(wrappers, false);
System.out.println(footer());
}
@Test
public void generateEnterpriseSearchSchemas()
throws Exception {
givenCollection(zeCollection).withConstellioESModule();
Map<String, Class<? extends RecordWrapper>> wrappers = new HashMap<>();
// Commons
wrappers.put(ConnectorType.DEFAULT_SCHEMA, ConnectorType.class);
wrappers.put(ConnectorInstance.DEFAULT_SCHEMA, ConnectorInstance.class);
// HTTP
wrappers.put(ConnectorHttpInstance.SCHEMA_CODE, ConnectorHttpInstance.class);
wrappers.put(ConnectorHttpDocument.DEFAULT_SCHEMA, ConnectorHttpDocument.class);
// SMB
wrappers.put(ConnectorSmbInstance.SCHEMA_CODE, ConnectorSmbInstance.class);
wrappers.put(ConnectorSmbDocument.DEFAULT_SCHEMA, ConnectorSmbDocument.class);
wrappers.put(ConnectorSmbFolder.DEFAULT_SCHEMA, ConnectorSmbFolder.class);
// LDAP
wrappers.put(ConnectorLDAPInstance.SCHEMA_CODE, ConnectorLDAPInstance.class);
wrappers.put(ConnectorLDAPUserDocument.DEFAULT_SCHEMA, ConnectorLDAPUserDocument.class);
System.out.println(header());
printGeneratedSchemas(wrappers, true);
System.out.println(footer());
}
@Test
public void generateTasksSchemas()
throws Exception {
givenCollection(zeCollection).withTaskModule();
Map<String, Class<? extends RecordWrapper>> wrappers = new HashMap<>();
// Task
wrappers.put(Task.DEFAULT_SCHEMA, Task.class);
wrappers.put(TaskStatus.DEFAULT_SCHEMA, TaskStatus.class);
System.out.println(header());
printGeneratedSchemas(wrappers, true);
System.out.println(footer());
}
protected void printGeneratedSchemas(Map<String, Class<? extends RecordWrapper>> wrappers, boolean appLayer)
throws Exception {
StringBuilder stringBuilder = new StringBuilder();
MetadataSchemaTypes types = getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(zeCollection);
for (MetadataSchemaType type : types.getSchemaTypes()) {
MetadataSchema defaultSchema = type.getDefaultSchema();
Class<? extends RecordWrapper> defaultSchemaWrapperClass = wrappers.get(defaultSchema.getCode());
if (defaultSchemaWrapperClass != null) {
stringBuilder.append(generateSchemaHelperMethods(defaultSchema, defaultSchemaWrapperClass.getSimpleName()));
stringBuilder.append(metadatasHelperMethod(type, defaultSchema, defaultSchemaWrapperClass));
}
for (MetadataSchema schema : type.getCustomSchemas()) {
Class<? extends RecordWrapper> wrapperClass = wrappers.get(schema.getCode());
if (wrapperClass != null) {
stringBuilder.append(generateSchemaHelperMethods(schema, wrapperClass.getSimpleName()));
stringBuilder.append(metadatasHelperMethod(type, schema, wrapperClass));
}
}
}
String code = stringBuilder.toString();
if (!appLayer) {
code = code.replace("appLayerFactory.getModelLayerFactory()", "modelLayerFactory");
}
System.out.println(code);
}
private String generateSchemaHelperMethods(MetadataSchema schema, String wrapperName) {
StringBuilder stringBuilder = new StringBuilder();
appendWrapElementHelperMethod(schema, wrapperName, stringBuilder);
appendWrapElementsHelperMethod(schema, wrapperName, stringBuilder);
appendSearchByQueryElementsHelperMethod(schema, wrapperName, stringBuilder);
appendSearchByConditionElementsHelperMethod(schema, wrapperName, stringBuilder);
appendGetByIdHelperMethod(schema, wrapperName, stringBuilder);
appendGetByIdsHelperMethod(schema, wrapperName, stringBuilder);
if (schema.hasMetadataWithCode("code")) {
appendGetByCodeHelperMethod(schema, wrapperName, stringBuilder);
}
appendGetByLegacyIdHelperMethod(schema, wrapperName, stringBuilder);
appendNewHelperMethod(schema, wrapperName, stringBuilder);
appendNewWithIdHelperMethod(schema, wrapperName, stringBuilder);
return stringBuilder.toString();
}
private void appendGetByCodeHelperMethod(MetadataSchema schema, String wrapperName, StringBuilder stringBuilder) {
String schemaTypeCall = schemaTypeCallerFor(schema);
stringBuilder.append("\n\tpublic " + wrapperName + " get" + wrapperName + "WithCode(String code) {");
stringBuilder.append("\n\t\treturn wrap" + wrapperName + "(getByCode(" + schemaTypeCall + ", code));");
stringBuilder.append("\n\t}\n");
}
private void appendNewHelperMethod(MetadataSchema schema, String wrapperName, StringBuilder stringBuilder) {
String schemaCall = schemaCallerFor(schema);
stringBuilder.append("\n\tpublic " + wrapperName + " new" + wrapperName + "() {");
stringBuilder.append("\n\t\treturn wrap" + wrapperName + "(create(" + schemaCall + "));");
stringBuilder.append("\n\t}\n");
}
private String schemaCallerFor(MetadataSchema schema) {
if (schema.getLocalCode().equals("default")) {
return new SchemaUtils().getSchemaTypeCode(schema.getCode()) + ".schema()";
} else {
return schema.getCode() + ".schema()";
}
}
private String schemaTypeCallerFor(MetadataSchema schema) {
return new SchemaUtils().getSchemaTypeCode(schema.getCode()) + ".schemaType()";
}
private void appendNewWithIdHelperMethod(MetadataSchema schema, String wrapperName, StringBuilder stringBuilder) {
String schemaCall = schemaCallerFor(schema);
stringBuilder.append("\n\tpublic " + wrapperName + " new" + wrapperName + "WithId(String id) {");
stringBuilder.append("\n\t\treturn wrap" + wrapperName + "(create(" + schemaCall + ", id));");
stringBuilder.append("\n\t}\n");
}
private void appendGetByLegacyIdHelperMethod(MetadataSchema schema, String wrapperName, StringBuilder stringBuilder) {
String schemaTypeCall = schemaTypeCallerFor(schema);
stringBuilder.append("\n\tpublic " + wrapperName + " get" + wrapperName + "WithLegacyId(String legacyId) {");
stringBuilder.append("\n\t\treturn wrap" + wrapperName + "(getByLegacyId(" + schemaTypeCall + ", legacyId));");
stringBuilder.append("\n\t}\n");
}
private void appendGetByIdHelperMethod(MetadataSchema schema, String wrapperName, StringBuilder stringBuilder) {
stringBuilder.append("\n\tpublic " + wrapperName + " get" + wrapperName + "(String id) {");
stringBuilder.append("\n\t\treturn wrap" + wrapperName + "(get(id));");
stringBuilder.append("\n\t}\n");
}
private void appendGetByIdsHelperMethod(MetadataSchema schema, String wrapperName, StringBuilder stringBuilder) {
stringBuilder.append("\n\tpublic List<" + wrapperName + "> get" + wrapperName + "s(List<String> ids) {");
stringBuilder.append("\n\t\treturn wrap" + wrapperName + "s(get(ids));");
stringBuilder.append("\n\t}\n");
}
private void appendWrapElementHelperMethod(MetadataSchema schema, String wrapperName, StringBuilder stringBuilder) {
stringBuilder.append("\n\tpublic " + wrapperName + " wrap" + wrapperName + "(Record record) {");
stringBuilder.append("\n\t\treturn record == null ? null : new " + wrapperName + "(record, getTypes());");
stringBuilder.append("\n\t}\n");
}
private void appendWrapElementsHelperMethod(MetadataSchema schema, String wrapperName, StringBuilder stringBuilder) {
stringBuilder.append("\n\tpublic List<" + wrapperName + "> wrap" + wrapperName + "s(List<Record> records) {");
stringBuilder.append("\n\t\tList<" + wrapperName + "> wrapped = new ArrayList<>();");
stringBuilder.append("\n\t\tfor (Record record : records) {");
stringBuilder.append("\n\t\t\twrapped.add(new " + wrapperName + "(record, getTypes()));");
stringBuilder.append("\n\t\t}\n");
stringBuilder.append("\n\t\treturn wrapped;");
stringBuilder.append("\n\t}\n");
}
private void appendSearchByQueryElementsHelperMethod(MetadataSchema schema, String wrapperName, StringBuilder stringBuilder) {
stringBuilder.append("\n\tpublic List<" + wrapperName + "> search" + wrapperName + "s(LogicalSearchQuery query) {");
stringBuilder.append("\n\t\treturn wrap" + wrapperName
+ "s(appLayerFactory.getModelLayerFactory().newSearchServices().search(query));");
stringBuilder.append("\n\t}\n");
}
private void appendSearchByConditionElementsHelperMethod(MetadataSchema schema, String wrapperName,
StringBuilder stringBuilder) {
stringBuilder
.append("\n\tpublic List<" + wrapperName + "> search" + wrapperName + "s(LogicalSearchCondition condition) {");
stringBuilder.append("\n\t\tMetadataSchemaType type = " + schemaTypeCallerFor(schema) + ";");
stringBuilder
.append("\n\t\tLogicalSearchQuery query = new LogicalSearchQuery(from(type).whereAllConditions(asList(condition)));");
stringBuilder.append("\n\t\treturn wrap" + wrapperName
+ "s(appLayerFactory.getModelLayerFactory().newSearchServices().search(query));");
stringBuilder.append("\n\t}\n");
}
private String metadatasHelperMethod(MetadataSchemaType type, MetadataSchema schema,
Class<? extends RecordWrapper> recordWrapperClass)
throws Exception {
StringBuilder stringBuilder = new StringBuilder();
Map<String, String> wrapperDeclaredFields = getDeclaredFields(recordWrapperClass);
String shortcutClass, shortcutExtendsClass, variableName;
boolean customSchema;
if (schema.getLocalCode().equals("default")) {
shortcutClass = "SchemaTypeShortcuts_" + schema.getCode();
shortcutExtendsClass = "SchemaTypeShortcuts";
variableName = type.getCode();
customSchema = false;
} else {
shortcutClass = "SchemaTypeShortcuts_" + schema.getCode();
shortcutExtendsClass = "SchemaTypeShortcuts_" + type.getCode() + "_default";
variableName = schema.getCode();
customSchema = true;
}
stringBuilder.append("\n\tpublic final " + shortcutClass + " " + variableName + "\n\t\t = new " + shortcutClass + "(\""
+ schema.getCode() + "\");");
stringBuilder.append("\n\tpublic class " + shortcutClass + " extends " + shortcutExtendsClass + " {");
stringBuilder.append("\n\t\tprotected " + shortcutClass + "(String schemaCode) {");
stringBuilder.append("\n\t\t\tsuper(schemaCode);");
stringBuilder.append("\n\t}");
for (Metadata metadata : schema.getMetadatas()) {
if (metadata.getInheritance() == null && (customSchema || wrapperDeclaredFields
.containsKey(metadata.getLocalCode()))) {
stringBuilder.append("\n");
stringBuilder.append("\n\t\tpublic Metadata " + metadata.getLocalCode() + "() {");
stringBuilder.append("\n\t\t\treturn metadata(\"" + metadata.getLocalCode() + "\");");
stringBuilder.append("\n\t\t}");
}
}
stringBuilder.append("\n\t}");
return stringBuilder.toString();
}
private Map<String, String> getDeclaredFields(Class<? extends RecordWrapper> recordWrapperClass)
throws Exception {
Map<String, String> declaredFields = new HashMap<>();
for (Field field : recordWrapperClass.getDeclaredFields()) {
if (Modifier.isPublic(field.getModifiers()) && Modifier.isStatic(field.getModifiers()) && String.class
.equals(field.getType())) {
String value = (String) field.get(null);
declaredFields.put(value, field.getName());
}
}
return declaredFields;
}
protected String header() {
String line = "/** " + StringUtils.repeat("** ", 25) + "**/";
return line + "\n\t\t// Auto-generated methods by "
+ "" + this.getClass().getSimpleName() + " -- start\n" + line + "\n\n";
}
protected String footer() {
String line = "/** " + StringUtils.repeat("** ", 25) + "**/";
return line + "\n\t\t// Auto-generated methods by " + this.getClass().getSimpleName() + " -- end\n" + line + "\n\n";
}
private interface SchemasFilter {
boolean isGenerated(Metadata metadata);
}
}