org.onexus.website.api.widgets.tableviewer.columns.ColumnConfig.java Source code

Java tutorial

Introduction

Here is the source code for org.onexus.website.api.widgets.tableviewer.columns.ColumnConfig.java

Source

/**
 *  Copyright 2012 Universitat Pompeu Fabra.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 *
 */
package org.onexus.website.api.widgets.tableviewer.columns;

import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.util.string.Strings;
import org.onexus.collection.api.Collection;
import org.onexus.collection.api.Field;
import org.onexus.collection.api.IEntityTable;
import org.onexus.collection.api.query.Query;
import org.onexus.collection.api.utils.QueryUtils;
import org.onexus.resource.api.IResourceManager;
import org.onexus.resource.api.ORI;
import org.onexus.resource.api.Property;
import org.onexus.resource.api.annotations.ResourceAlias;
import org.onexus.website.api.WebsiteApplication;
import org.onexus.website.api.widgets.tableviewer.decorators.IDecorator;
import org.onexus.website.api.widgets.tableviewer.decorators.IDecoratorManager;
import org.onexus.website.api.widgets.tableviewer.headers.CollectionHeader;
import org.onexus.website.api.widgets.tableviewer.headers.FieldHeader;

import javax.inject.Inject;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;

@ResourceAlias("column")
public class ColumnConfig implements IColumnConfig {

    private String label;

    private String title;

    private ORI collection;

    private String fields;

    private String template;

    private String decorator;

    private String actions;

    private String visible;

    private String sortable;

    private String filter;

    private Integer length;

    public ColumnConfig() {
        super();
    }

    public ColumnConfig(ORI collectionId) {
        this(collectionId, null, null);
    }

    public ColumnConfig(ORI collectionId, String fields) {
        this(collectionId, fields, null);
    }

    public ColumnConfig(ORI collectionURI, String fields, String decorator) {
        super();

        this.collection = collectionURI;
        this.fields = fields;
        this.decorator = decorator;
    }

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public ORI getCollection() {
        return collection;
    }

    public void setCollection(ORI collectionURI) {
        this.collection = collectionURI;
    }

    public String getFields() {
        return fields;
    }

    public void setFields(String fields) {
        this.fields = fields;
    }

    public String getTemplate() {
        return template;
    }

    public void setTemplate(String template) {
        this.template = template;
    }

    public String getDecorator() {
        return decorator;
    }

    public void setDecorator(String decorator) {
        this.decorator = decorator;
    }

    public String getActions() {
        return actions;
    }

    public void setActions(String actions) {
        this.actions = actions;
    }

    @Override
    public String getSortable() {
        return sortable;
    }

    public void setSortable(String sortable) {
        this.sortable = sortable;
    }

    public String getFilter() {
        return filter;
    }

    public void setFilter(String filter) {
        this.filter = filter;
    }

    public Integer getLength() {
        return length;
    }

    public void setLength(Integer length) {
        this.length = length;
    }

    @Override
    public void addColumns(List<IColumn<IEntityTable, String>> columns, ORI parentURI, boolean sortable) {

        ORI collectionURI = collection.toAbsolute(parentURI);
        Collection collection = getResourceManager().load(Collection.class, collectionURI);

        if (collection != null) {
            List<Field> fields = getFields(collection, parentURI);

            if (Strings.isEmpty(template)) {
                for (Field field : fields) {

                    if (length != null) {
                        if (field.getProperty("MAX_LENGTH") != null) {
                            for (Property property : field.getProperties()) {
                                if (property.getKey().equalsIgnoreCase("MAX_LENGTH")) {
                                    property.setValue(length.toString());
                                    break;
                                }
                            }
                        } else {
                            if (field.getProperties() == null) {
                                field.setProperties(new ArrayList<Property>());
                            }

                            field.getProperties().add(new Property("MAX_LENGTH", length.toString()));
                        }
                    }

                    IDecorator decoratorImpl = getDecoratorManager().getDecorator(decorator, collection, field);
                    List<IDecorator> actionsImpl = createActions(collection, field);

                    columns.add(new CollectionColumn(
                            collectionURI, new FieldHeader(label, title, collection, field,
                                    new CollectionHeader(collection), filter, sortable),
                            decoratorImpl, actionsImpl));
                }
            } else {
                Field field = fields.get(0);

                IDecorator decoratorImpl = getDecoratorManager().getDecorator(decorator, collection, field);
                List<IDecorator> actionsImpl = createActions(collection, field);
                decoratorImpl.setTemplate(template);

                columns.add(new CollectionColumn(collectionURI, new FieldHeader(label, title, collection, field,
                        new CollectionHeader(collection), filter, sortable), decoratorImpl, actionsImpl));
            }
        }
    }

    private List<IDecorator> createActions(Collection collection, Field field) {

        if (actions == null) {
            return Collections.emptyList();
        }

        List<IDecorator> actionsImpl = new ArrayList<IDecorator>();
        for (String action : actions.split("::")) {
            IDecorator actionImpl = getDecoratorManager().getDecorator(action.trim(), collection, field);
            if (actionImpl != null) {
                actionsImpl.add(actionImpl);
            }
        }

        return actionsImpl;

    }

    protected List<Field> getFields(Collection collection, ORI parentOri) {
        List<Field> fields;

        if (this.fields == null) {
            fields = new ArrayList<Field>();
            for (Field field : collection.getFields()) {
                fields.add(field);
            }
        } else {
            fields = new ArrayList<Field>();

            for (String fieldName : this.fields.split(",")) {
                if (fieldName.trim().startsWith("*{")) {
                    String regExp = fieldName.trim().substring(2);
                    regExp = regExp.substring(0, regExp.lastIndexOf('}'));
                    Pattern pattern = Pattern.compile(regExp);
                    for (Field field : collection.getFields()) {
                        if (pattern.matcher(field.getId()).matches()) {
                            fields.add(field);
                        }
                    }
                } else {

                    Field field = null;

                    if (collection != null && fieldName != null) {
                        field = collection.getField(fieldName.trim());
                    }

                    if (field == null) {
                        throw new RuntimeException(
                                "Field '" + fieldName + "' not found on collection '" + collection.getORI() + "'.");
                    } else {
                        fields.add(field);
                    }
                }

            }
        }
        return fields;
    }

    @Override
    public void buildQuery(Query query) {

        ORI collectionURI = collection.toAbsolute(query.getOn());
        String columnAlias = QueryUtils.newCollectionAlias(query, collectionURI);
        Collection collection = getResourceManager().load(Collection.class, collectionURI);

        if (collection != null) {
            List<Field> fields = getFields(collection, query.getOn());
            Set<String> fieldIds = new HashSet<String>(fields.size());
            for (Field field : fields) {
                fieldIds.add(field.getId());

                for (IDecorator decorator : createActions(collection, field)) {
                    addExtraFields(fieldIds, decorator, collection);
                }

                if (decorator != null) {
                    IDecorator decorator = getDecoratorManager().getDecorator(this.decorator, collection, field);
                    addExtraFields(fieldIds, decorator, collection);
                }
            }
            query.addSelect(columnAlias, new ArrayList<String>(fieldIds));

        }
    }

    private static void addExtraFields(Set<String> fieldIds, IDecorator decorator, Collection collection) {
        List<String> decoratorExtraFields = decorator.getExtraFields(collection);
        if (decoratorExtraFields != null && !decoratorExtraFields.isEmpty()) {
            fieldIds.addAll(decoratorExtraFields);
        }
    }

    @Inject
    private IResourceManager resourceManager;

    @Inject
    private IDecoratorManager decoratorManager;

    protected IResourceManager getResourceManager() {
        if (resourceManager == null) {
            WebsiteApplication.inject(this);
        }
        return resourceManager;
    }

    protected IDecoratorManager getDecoratorManager() {
        if (decoratorManager == null) {
            WebsiteApplication.inject(this);
        }
        return decoratorManager;
    }

    @Override
    public String getVisible() {
        return visible;
    }

    public void setVisible(String visible) {
        this.visible = visible;
    }
}