Search in sources :

Example 1 with SelectionProviderReference

use of com.manydesigns.portofino.resourceactions.crud.configuration.database.SelectionProviderReference in project Portofino by ManyDesigns.

the class CrudAction method saveConfiguration.

@Override
protected boolean saveConfiguration(Object configuration) {
    CrudConfiguration crudConfiguration = (CrudConfiguration) configuration;
    List<SelectionProviderReference> sps = new ArrayList<>(crudConfiguration.getSelectionProviders());
    crudConfiguration.getSelectionProviders().clear();
    crudConfiguration.persistence = persistence;
    crudConfiguration.init();
    sps.forEach(sp -> {
        ForeignKey fk = DatabaseLogic.findForeignKeyByName(crudConfiguration.getActualTable(), sp.getSelectionProviderName());
        if (fk != null) {
            sp.setForeignKeyName(sp.getSelectionProviderName());
            sp.setSelectionProviderName(null);
        }
        if (sp.getSelectionProviderName() != null || sp.getForeignKeyName() != null) {
            crudConfiguration.getSelectionProviders().add(sp);
        }
    });
    List<CrudProperty> existingProperties = this.crudConfiguration.getProperties();
    List<CrudProperty> configuredProperties = crudConfiguration.getProperties();
    List<CrudProperty> newProperties = configuredProperties.stream().map(p1 -> {
        Optional<CrudProperty> maybeP2 = existingProperties.stream().filter(p2 -> p1.getName().equals(p2.getName())).findFirst();
        CrudProperty p2 = maybeP2.orElse(new CrudProperty());
        p2.setName(p1.getName());
        p2.setEnabled(p1.isEnabled());
        p2.setInsertable(p1.isInsertable());
        p2.setInSummary(p1.isInSummary());
        p2.setLabel(p1.getLabel());
        p2.setSearchable(p1.isSearchable());
        p2.setUpdatable(p1.isUpdatable());
        return p2;
    }).collect(Collectors.toList());
    crudConfiguration.setProperties(newProperties);
    return super.saveConfiguration(crudConfiguration);
}
Also used : Persistence(com.manydesigns.portofino.persistence.Persistence) StringUtils(org.apache.commons.lang.StringUtils) java.util(java.util) TableCriteria(com.manydesigns.portofino.persistence.TableCriteria) ResourceActionName(com.manydesigns.portofino.resourceactions.ResourceActionName) CrudConfiguration(com.manydesigns.portofino.resourceactions.crud.configuration.database.CrudConfiguration) QueryStringWithParameters(com.manydesigns.elements.text.QueryStringWithParameters) LoggerFactory(org.slf4j.LoggerFactory) Session(org.hibernate.Session) Autowired(org.springframework.beans.factory.annotation.Autowired) Insertable(com.manydesigns.elements.annotations.Insertable) ConfigurationClass(com.manydesigns.portofino.resourceactions.annotations.ConfigurationClass) SupportsPermissions(com.manydesigns.portofino.security.SupportsPermissions) PlainSelect(net.sf.jsqlparser.statement.select.PlainSelect) JSQLParserException(net.sf.jsqlparser.JSQLParserException) ElementsThreadLocals(com.manydesigns.elements.ElementsThreadLocals) DatabaseLogic(com.manydesigns.portofino.model.database.DatabaseLogic) TableAccessor(com.manydesigns.portofino.reflection.TableAccessor) ClassAccessor(com.manydesigns.elements.reflection.ClassAccessor) Function(net.sf.jsqlparser.expression.Function) ExpressionList(net.sf.jsqlparser.expression.operators.relational.ExpressionList) PropertyAccessor(com.manydesigns.elements.reflection.PropertyAccessor) Table(com.manydesigns.portofino.model.database.Table) SelectItem(net.sf.jsqlparser.statement.select.SelectItem) QueryUtils(com.manydesigns.portofino.persistence.QueryUtils) SelectionProviderReference(com.manydesigns.portofino.resourceactions.crud.configuration.database.SelectionProviderReference) AccessLevel(com.manydesigns.portofino.security.AccessLevel) Updatable(com.manydesigns.elements.annotations.Updatable) Logger(org.slf4j.Logger) ConstraintViolationException(org.hibernate.exception.ConstraintViolationException) CrudProperty(com.manydesigns.portofino.resourceactions.crud.configuration.CrudProperty) RequiresPermissions(com.manydesigns.portofino.security.RequiresPermissions) Collectors(java.util.stream.Collectors) IdStrategy(com.manydesigns.portofino.persistence.IdStrategy) RequestMessages(com.manydesigns.elements.messages.RequestMessages) Serializable(java.io.Serializable) PkHelper(com.manydesigns.portofino.util.PkHelper) SelectExpressionItem(net.sf.jsqlparser.statement.select.SelectExpressionItem) ScriptTemplate(com.manydesigns.portofino.resourceactions.annotations.ScriptTemplate) Database(com.manydesigns.portofino.model.database.Database) Select(net.sf.jsqlparser.statement.select.Select) ForeignKey(com.manydesigns.portofino.model.database.ForeignKey) StringReader(java.io.StringReader) ActionInstance(com.manydesigns.portofino.resourceactions.ActionInstance) NotNull(org.jetbrains.annotations.NotNull) CCJSqlParserManager(net.sf.jsqlparser.parser.CCJSqlParserManager) SelectionProviderReference(com.manydesigns.portofino.resourceactions.crud.configuration.database.SelectionProviderReference) CrudProperty(com.manydesigns.portofino.resourceactions.crud.configuration.CrudProperty) ForeignKey(com.manydesigns.portofino.model.database.ForeignKey) CrudConfiguration(com.manydesigns.portofino.resourceactions.crud.configuration.database.CrudConfiguration)

Example 2 with SelectionProviderReference

use of com.manydesigns.portofino.resourceactions.crud.configuration.database.SelectionProviderReference in project Portofino by ManyDesigns.

the class ModelSelectionProviderSupport method setupSelectionProvider.

protected boolean setupSelectionProvider(@Nullable SelectionProviderReference ref, DatabaseSelectionProvider current, Set<String> configuredSPs) {
    List<Reference> references = current.getReferences();
    String[] fieldNames = new String[references.size()];
    Class[] fieldTypes = new Class[references.size()];
    int i = 0;
    for (Reference reference : references) {
        Column column = reference.getActualFromColumn();
        fieldNames[i] = column.getActualPropertyName();
        fieldTypes[i] = column.getActualJavaType();
        i++;
    }
    availableSelectionProviders.put(Arrays.asList(fieldNames), current);
    for (String fieldName : fieldNames) {
        // If another SP is configured for the same field, stop
        if (configuredSPs.contains(fieldName)) {
            return false;
        }
    }
    if (ref == null || ref.isEnabled()) {
        DisplayMode dm = ref != null ? ref.getDisplayMode() : DisplayMode.DROPDOWN;
        SearchDisplayMode sdm = ref != null ? ref.getSearchDisplayMode() : SearchDisplayMode.DROPDOWN;
        String newHref = ref != null ? ref.getCreateNewValueHref() : null;
        String newText = ref != null ? ref.getCreateNewValueText() : null;
        SelectionProvider selectionProvider = createSelectionProvider(current, fieldNames, fieldTypes, dm, sdm, newHref, newText);
        CrudSelectionProvider crudSelectionProvider = new CrudSelectionProvider(selectionProvider, fieldNames, !(current instanceof ForeignKey));
        crudSelectionProviders.add(crudSelectionProvider);
        Collections.addAll(configuredSPs, fieldNames);
        return true;
    } else {
        // To avoid automatically adding a FK later
        CrudSelectionProvider crudSelectionProvider = new CrudSelectionProvider(null, fieldNames, false);
        crudSelectionProviders.add(crudSelectionProvider);
        return false;
    }
}
Also used : SelectionProviderReference(com.manydesigns.portofino.resourceactions.crud.configuration.database.SelectionProviderReference)

Example 3 with SelectionProviderReference

use of com.manydesigns.portofino.resourceactions.crud.configuration.database.SelectionProviderReference in project Portofino by ManyDesigns.

the class ModelSelectionProviderSupport method makeSelectionProviderReference.

protected SelectionProviderReference makeSelectionProviderReference(ModelSelectionProvider dsp) {
    SelectionProviderReference sel = new SelectionProviderReference();
    if (dsp instanceof ForeignKey) {
        sel.setForeignKeyName(dsp.getName());
    } else {
        sel.setSelectionProviderName(dsp.getName());
    }
    crudAction.getCrudConfiguration().getSelectionProviders().add(sel);
    return sel;
}
Also used : SelectionProviderReference(com.manydesigns.portofino.resourceactions.crud.configuration.database.SelectionProviderReference)

Example 4 with SelectionProviderReference

use of com.manydesigns.portofino.resourceactions.crud.configuration.database.SelectionProviderReference in project Portofino by ManyDesigns.

the class ModelSelectionProviderSupport method setup.

public void setup() {
    crudSelectionProviders = new ArrayList<>();
    Set<String> configuredSPs = new HashSet<>();
    for (SelectionProviderReference ref : crudAction.getCrudConfiguration().getSelectionProviders()) {
        boolean added;
        if (ref.getForeignKey() != null) {
            added = setupSelectionProvider(ref, ref.getForeignKey(), configuredSPs);
        } else if (ref.getSelectionProvider() instanceof DatabaseSelectionProvider) {
            DatabaseSelectionProvider dsp = (DatabaseSelectionProvider) ref.getSelectionProvider();
            added = setupSelectionProvider(ref, dsp, configuredSPs);
        } else {
            logger.error("Unsupported selection provider: " + ref.getSelectionProvider());
            continue;
        }
        if (ref.isEnabled() && !added) {
            logger.warn("Selection provider {} not added; check whether the fields on which it is configured " + "overlap with some other selection provider", ref);
        }
    }
    // Remove disabled selection providers and mark them as configured to avoid re-adding them
    Iterator<CrudSelectionProvider> it = crudSelectionProviders.iterator();
    while (it.hasNext()) {
        CrudSelectionProvider sp = it.next();
        if (sp.getSelectionProvider() == null) {
            it.remove();
            Collections.addAll(configuredSPs, sp.getFieldNames());
        }
    }
    Table table = crudAction.getCrudConfiguration().getActualTable();
    if (table != null) {
        for (ForeignKey fk : table.getForeignKeys()) {
            setupSelectionProvider(null, fk, configuredSPs);
        }
        for (ModelSelectionProvider dsp : table.getSelectionProviders()) {
            if (dsp instanceof DatabaseSelectionProvider) {
                setupSelectionProvider(null, (DatabaseSelectionProvider) dsp, configuredSPs);
            } else {
                logger.error("Unsupported selection provider: " + dsp);
            }
        }
    }
}
Also used : SelectionProviderReference(com.manydesigns.portofino.resourceactions.crud.configuration.database.SelectionProviderReference)

Example 5 with SelectionProviderReference

use of com.manydesigns.portofino.resourceactions.crud.configuration.database.SelectionProviderReference in project Portofino by ManyDesigns.

the class ModelSelectionProviderSupport method disableSelectionProvider.

public void disableSelectionProvider(List<String> key) {
    // TODO this is a shortcut: takes the first available selection provider and disables it
    Collection<ModelSelectionProvider> selectionProviders = availableSelectionProviders.get(key);
    ModelSelectionProvider dsp = selectionProviders.iterator().next();
    SelectionProviderReference sel = makeSelectionProviderReference(dsp);
    sel.setEnabled(false);
}
Also used : SelectionProviderReference(com.manydesigns.portofino.resourceactions.crud.configuration.database.SelectionProviderReference)

Aggregations

SelectionProviderReference (com.manydesigns.portofino.resourceactions.crud.configuration.database.SelectionProviderReference)6 ElementsThreadLocals (com.manydesigns.elements.ElementsThreadLocals)1 Insertable (com.manydesigns.elements.annotations.Insertable)1 Updatable (com.manydesigns.elements.annotations.Updatable)1 RequestMessages (com.manydesigns.elements.messages.RequestMessages)1 ClassAccessor (com.manydesigns.elements.reflection.ClassAccessor)1 PropertyAccessor (com.manydesigns.elements.reflection.PropertyAccessor)1 QueryStringWithParameters (com.manydesigns.elements.text.QueryStringWithParameters)1 Database (com.manydesigns.portofino.model.database.Database)1 DatabaseLogic (com.manydesigns.portofino.model.database.DatabaseLogic)1 ForeignKey (com.manydesigns.portofino.model.database.ForeignKey)1 Table (com.manydesigns.portofino.model.database.Table)1 IdStrategy (com.manydesigns.portofino.persistence.IdStrategy)1 Persistence (com.manydesigns.portofino.persistence.Persistence)1 QueryUtils (com.manydesigns.portofino.persistence.QueryUtils)1 TableCriteria (com.manydesigns.portofino.persistence.TableCriteria)1 TableAccessor (com.manydesigns.portofino.reflection.TableAccessor)1 ActionInstance (com.manydesigns.portofino.resourceactions.ActionInstance)1 ResourceActionName (com.manydesigns.portofino.resourceactions.ResourceActionName)1 ConfigurationClass (com.manydesigns.portofino.resourceactions.annotations.ConfigurationClass)1