Search in sources :

Example 1 with TableInfo

use of com.manydesigns.portofino.upstairs.actions.support.TableInfo in project Portofino by ManyDesigns.

the class ConnectionsAction method determineRoots.

protected List<TableInfo> determineRoots(List<Schema> schemas) {
    List<TableInfo> roots = new ArrayList<>();
    Multimap<Table, Reference> children = ArrayListMultimap.create();
    for (Schema schema : schemas) {
        if (!schema.getAnnotation(ExcludeFromWizard.class).isPresent()) {
            for (Table table : schema.getTables()) {
                roots.add(new TableInfo(table));
            }
        }
    }
    for (Iterator<TableInfo> it = roots.iterator(); it.hasNext(); ) {
        TableInfo tableInfo = it.next();
        Table table = tableInfo.table;
        // Exclude tables with no primary key
        if (table.getPrimaryKey() == null) {
            it.remove();
            continue;
        }
        // Exclude Liquibase tables
        if ("databasechangeloglock".equalsIgnoreCase(table.getTableName())) {
            it.remove();
            continue;
        }
        for (ForeignKey fk : table.getForeignKeys()) {
            for (Reference ref : fk.getReferences()) {
                Column column = ref.getActualToColumn();
                if (column.getTable() != table) {
                    children.put(column.getTable(), ref);
                    // TODO potrebbe essere un ciclo nel grafo...
                    tableInfo.root = false;
                }
            }
        }
        for (ModelSelectionProvider sp : table.getSelectionProviders()) {
            for (Reference ref : sp.getReferences()) {
                Column column = ref.getActualToColumn();
                if (column != null && column.getTable() != table) {
                    children.put(column.getTable(), ref);
                    // TODO potrebbe essere un ciclo nel grafo...
                    tableInfo.root = false;
                }
            }
        }
    }
    roots.forEach(i -> {
        Collection<Reference> c = children.get(i.table);
        if (c != null) {
            i.children.addAll(c);
        }
    });
    return roots;
}
Also used : SelectableSchema(com.manydesigns.portofino.upstairs.actions.database.connections.support.SelectableSchema) TableInfo(com.manydesigns.portofino.upstairs.actions.support.TableInfo)

Example 2 with TableInfo

use of com.manydesigns.portofino.upstairs.actions.support.TableInfo in project Portofino by ManyDesigns.

the class UpstairsAction method createApplication.

@POST
@Path("application")
public List<Map> createApplication(WizardInfo wizard) throws Exception {
    List<Map> createdPages = new ArrayList<>();
    String strategy = wizard.strategy;
    switch(strategy) {
        case "automatic":
        case "manual":
            String databaseName = (String) (wizard.connectionProvider).get("name");
            List<TableInfo> tables = wizard.tables;
            Database database = DatabaseLogic.findDatabaseByName(persistence.getModel(), databaseName);
            if (database == null) {
                throw new WebApplicationException("The database does not exist: " + databaseName);
            }
            TemplateEngine engine = new SimpleTemplateEngine();
            Template template = engine.createTemplate(UpstairsAction.class.getResource("/com/manydesigns/portofino/upstairs/wizard/CrudAction.groovy"));
            Table userTable = getTable(persistence.getModel(), wizard.usersTable);
            Column userPasswordColumn = getColumn(userTable, wizard.userPasswordProperty);
            boolean userCrudCreated = false;
            for (TableInfo tableInfo : tables) {
                if (tableInfo.selected) {
                    Table tableRef = tableInfo.table;
                    String tableName = tableRef.getTableName();
                    Table table = DatabaseLogic.findTableByName(persistence.getModel(), databaseName, tableInfo.schema, tableName);
                    if (table == null) {
                        logger.warn("Table not found: {}", tableRef.getQualifiedName());
                        RequestMessages.addErrorMessage("Table not found: " + tableRef.getQualifiedName());
                        continue;
                    }
                    if (table == userTable) {
                        userCrudCreated = true;
                    }
                    FileObject dir = actionsDirectory.resolveFile(table.getActualEntityName());
                    createCrudAction(database.getConnectionProvider(), dir, table, template, userTable, userPasswordColumn, createdPages);
                }
            }
            if (userTable != null) {
                if (!userCrudCreated) {
                    FileObject dir = actionsDirectory.resolveFile(userTable.getActualEntityName());
                    createCrudAction(database.getConnectionProvider(), dir, userTable, template, userTable, userPasswordColumn, createdPages);
                }
                setupUserPages(database.getConnectionProvider(), template, userTable, createdPages);
            }
            break;
        case "none":
            break;
        default:
            throw new WebApplicationException("Invalid strategy: " + strategy);
    }
    return createdPages;
}
Also used : Template(groovy.text.Template) TemplateEngine(groovy.text.TemplateEngine) SimpleTemplateEngine(groovy.text.SimpleTemplateEngine) TableInfo(com.manydesigns.portofino.upstairs.actions.support.TableInfo) FileObject(org.apache.commons.vfs2.FileObject) SimpleTemplateEngine(groovy.text.SimpleTemplateEngine)

Example 3 with TableInfo

use of com.manydesigns.portofino.upstairs.actions.support.TableInfo in project Portofino by ManyDesigns.

the class ConnectionsAction method selectSchemas.

@PUT
@Path("{databaseName}/schemas")
@Produces(MediaType.APPLICATION_JSON)
public List<TableInfo> selectSchemas(@PathParam("databaseName") String databaseName, String jsonInput) throws Exception {
    ConnectionProvider connectionProvider = persistence.getConnectionProvider(databaseName);
    if (connectionProvider == null) {
        throw new WebApplicationException(Response.Status.NOT_FOUND);
    }
    updateSchemas(connectionProvider, new JSONArray(jsonInput), (database, schema) -> schema.ensureAnnotation(ExcludeFromWizard.class));
    persistence.syncDataModel(databaseName);
    persistence.initModel();
    persistence.saveXmlModel();
    logger.info("Schemas for database {} updated", databaseName);
    List<TableInfo> tableInfos = determineRoots(connectionProvider.getDatabase().getSchemas());
    tableInfos.sort(Comparator.comparing(t -> t.table.getQualifiedName()));
    return tableInfos;
}
Also used : ArrayListMultimap(com.google.common.collect.ArrayListMultimap) Persistence(com.manydesigns.portofino.persistence.Persistence) java.util(java.util) Field(com.manydesigns.elements.fields.Field) Connection(java.sql.Connection) AbstractResourceAction(com.manydesigns.portofino.resourceactions.AbstractResourceAction) BiFunction(java.util.function.BiFunction) LoggerFactory(org.slf4j.LoggerFactory) Autowired(org.springframework.beans.factory.annotation.Autowired) DatabaseMetaData(java.sql.DatabaseMetaData) Multimap(com.google.common.collect.Multimap) ConnectionProviderSummary(com.manydesigns.portofino.upstairs.actions.database.connections.support.ConnectionProviderSummary) StringUtils(org.apache.commons.lang3.StringUtils) Form(com.manydesigns.elements.forms.Form) MediaType(javax.ws.rs.core.MediaType) FormUtil(com.manydesigns.elements.util.FormUtil) JSONObject(org.json.JSONObject) JSONStringer(org.json.JSONStringer) BiConsumer(java.util.function.BiConsumer) ExcludeFromWizard(com.manydesigns.portofino.upstairs.actions.database.connections.support.ExcludeFromWizard) URI(java.net.URI) RequiresAdministrator(com.manydesigns.portofino.security.RequiresAdministrator) Logger(org.slf4j.Logger) EntityMode(org.hibernate.EntityMode) Mode(com.manydesigns.elements.Mode) IOException(java.io.IOException) com.manydesigns.portofino.model.database(com.manydesigns.portofino.model.database) FileObject(org.apache.commons.vfs2.FileObject) JAXBException(javax.xml.bind.JAXBException) RequestMessages(com.manydesigns.elements.messages.RequestMessages) ConfigurationException(org.apache.commons.configuration2.ex.ConfigurationException) SelectableSchema(com.manydesigns.portofino.upstairs.actions.database.connections.support.SelectableSchema) TableInfo(com.manydesigns.portofino.upstairs.actions.support.TableInfo) javax.ws.rs(javax.ws.rs) Response(javax.ws.rs.core.Response) FormBuilder(com.manydesigns.elements.forms.FormBuilder) ConnectionProviderDetail(com.manydesigns.portofino.upstairs.actions.database.connections.support.ConnectionProviderDetail) FileType(org.apache.commons.vfs2.FileType) RequiresAuthentication(org.apache.shiro.authz.annotation.RequiresAuthentication) JSONArray(org.json.JSONArray) JSONArray(org.json.JSONArray) TableInfo(com.manydesigns.portofino.upstairs.actions.support.TableInfo) ExcludeFromWizard(com.manydesigns.portofino.upstairs.actions.database.connections.support.ExcludeFromWizard)

Example 4 with TableInfo

use of com.manydesigns.portofino.upstairs.actions.support.TableInfo in project Portofino by ManyDesigns.

the class TablesAction method saveTable.

@Path("{db}/{schema}/{table}")
@PUT
public void saveTable(@PathParam("db") String db, @PathParam("schema") String schema, @PathParam("table") String tableName, TableInfo tableInfo) throws Exception {
    Table table = tableInfo.table;
    Table existing = DatabaseLogic.findTableByName(persistence.getModel(), db, schema, tableName);
    if (existing == null) {
        throw new WebApplicationException(Response.Status.NOT_FOUND);
    }
    existing.setEntityName(table.getEntityName());
    existing.setJavaClass(table.getJavaClass());
    existing.setShortName(table.getShortName());
    for (Column column : table.getColumns()) {
        Column c2 = DatabaseLogic.findColumnByName(existing, column.getColumnName());
        BeanUtils.copyProperties(column, c2);
        c2.setTable(existing);
    }
    existing.getColumns().sort(Comparator.comparingInt(c -> table.getColumns().indexOf(DatabaseLogic.findColumnByName(table, c.getColumnName()))));
    existing.getSelectionProviders().clear();
    existing.getSelectionProviders().addAll(table.getSelectionProviders());
    existing.getSelectionProviders().forEach(sp -> {
        sp.setFromTable(existing);
        sp.getReferences().forEach(r -> r.setOwner(sp));
    });
    existing.removeAnnotation(EntityPermissions.class);
    Permissions permissions = tableInfo.permissions;
    if (permissions != null) {
        permissions.init();
        String allGroup = SecurityLogic.getAllGroup(portofinoConfiguration);
        List<String> create = new ArrayList<>();
        List<String> read = new ArrayList<>();
        List<String> update = new ArrayList<>();
        List<String> delete = new ArrayList<>();
        permissions.getActualPermissions().forEach((group, perms) -> {
            String actualGroup = group.equals(allGroup) ? "*" : group;
            if (perms.contains(AbstractCrudAction.PERMISSION_CREATE)) {
                create.add(actualGroup);
            }
            if (perms.contains(AbstractCrudAction.PERMISSION_READ)) {
                read.add(actualGroup);
            }
            if (perms.contains(AbstractCrudAction.PERMISSION_EDIT)) {
                update.add(actualGroup);
            }
            if (perms.contains(AbstractCrudAction.PERMISSION_DELETE)) {
                delete.add(actualGroup);
            }
        });
        if (create.size() == 1 && create.contains("*") && read.size() == 1 && read.contains("*") && update.size() == 1 && update.contains("*") && delete.size() == 1 && delete.contains("*")) {
        // Don't add the annotation: permissions have their default values
        } else {
            Annotation newAnn = new Annotation(EntityPermissions.class);
            newAnn.setProperty("create", StringUtils.join(create, ", "));
            newAnn.setProperty("read", StringUtils.join(read, ", "));
            newAnn.setProperty("update", StringUtils.join(update, ", "));
            newAnn.setProperty("delete", StringUtils.join(delete, ", "));
            existing.addAnnotation(newAnn);
        }
    }
    persistence.initModel();
    persistence.saveXmlModel();
}
Also used : ColumnAndAnnotations(com.manydesigns.portofino.upstairs.actions.database.tables.support.ColumnAndAnnotations) Persistence(com.manydesigns.portofino.persistence.Persistence) StringUtils(org.apache.commons.lang.StringUtils) java.util(java.util) AbstractResourceAction(com.manydesigns.portofino.resourceactions.AbstractResourceAction) MutablePropertyAccessor(com.manydesigns.elements.reflection.MutablePropertyAccessor) LoggerFactory(org.slf4j.LoggerFactory) Autowired(org.springframework.beans.factory.annotation.Autowired) SimpleDateFormat(java.text.SimpleDateFormat) AbstractCrudAction(com.manydesigns.portofino.resourceactions.crud.AbstractCrudAction) com.manydesigns.elements.annotations(com.manydesigns.elements.annotations) BigDecimal(java.math.BigDecimal) Form(com.manydesigns.elements.forms.Form) Property(com.manydesigns.portofino.model.Property) MediaType(javax.ws.rs.core.MediaType) EntityPermissions(com.manydesigns.portofino.resourceactions.crud.security.EntityPermissions) JSONStringer(org.json.JSONStringer) MapKeyValueAccessor(com.manydesigns.elements.MapKeyValueAccessor) Permissions(com.manydesigns.portofino.actions.Permissions) BigInteger(java.math.BigInteger) Annotation(com.manydesigns.portofino.model.Annotation) RequiresAdministrator(com.manydesigns.portofino.security.RequiresAdministrator) SecurityLogic(com.manydesigns.portofino.security.SecurityLogic) Logger(org.slf4j.Logger) DisplayMode(com.manydesigns.elements.options.DisplayMode) FileSystemException(org.apache.commons.vfs2.FileSystemException) MutableClassAccessor(com.manydesigns.elements.reflection.MutableClassAccessor) Group(com.manydesigns.portofino.actions.Group) com.manydesigns.portofino.model.database(com.manydesigns.portofino.model.database) FileObject(org.apache.commons.vfs2.FileObject) RequestMessages(com.manydesigns.elements.messages.RequestMessages) TableInfo(com.manydesigns.portofino.upstairs.actions.support.TableInfo) javax.ws.rs(javax.ws.rs) Response(javax.ws.rs.core.Response) SelectImpl(com.manydesigns.elements.annotations.impl.SelectImpl) SearchDisplayMode(com.manydesigns.elements.options.SearchDisplayMode) FormBuilder(com.manydesigns.elements.forms.FormBuilder) FileType(org.apache.commons.vfs2.FileType) EntityPermissionsChecks(com.manydesigns.portofino.resourceactions.crud.security.EntityPermissionsChecks) RequiresAuthentication(org.apache.shiro.authz.annotation.RequiresAuthentication) NotNull(org.jetbrains.annotations.NotNull) ReflectionUtil(com.manydesigns.elements.util.ReflectionUtil) ArrayUtils(org.apache.commons.lang.ArrayUtils) BeanUtils(org.springframework.beans.BeanUtils) EntityPermissions(com.manydesigns.portofino.resourceactions.crud.security.EntityPermissions) Permissions(com.manydesigns.portofino.actions.Permissions) Annotation(com.manydesigns.portofino.model.Annotation)

Aggregations

TableInfo (com.manydesigns.portofino.upstairs.actions.support.TableInfo)4 FileObject (org.apache.commons.vfs2.FileObject)3 Form (com.manydesigns.elements.forms.Form)2 FormBuilder (com.manydesigns.elements.forms.FormBuilder)2 RequestMessages (com.manydesigns.elements.messages.RequestMessages)2 com.manydesigns.portofino.model.database (com.manydesigns.portofino.model.database)2 Persistence (com.manydesigns.portofino.persistence.Persistence)2 AbstractResourceAction (com.manydesigns.portofino.resourceactions.AbstractResourceAction)2 RequiresAdministrator (com.manydesigns.portofino.security.RequiresAdministrator)2 java.util (java.util)2 javax.ws.rs (javax.ws.rs)2 MediaType (javax.ws.rs.core.MediaType)2 Response (javax.ws.rs.core.Response)2 FileType (org.apache.commons.vfs2.FileType)2 RequiresAuthentication (org.apache.shiro.authz.annotation.RequiresAuthentication)2 JSONStringer (org.json.JSONStringer)2 Logger (org.slf4j.Logger)2 LoggerFactory (org.slf4j.LoggerFactory)2 Autowired (org.springframework.beans.factory.annotation.Autowired)2 ArrayListMultimap (com.google.common.collect.ArrayListMultimap)1