ontopoly.components.FieldInstancesPanel.java Source code

Java tutorial

Introduction

Here is the source code for ontopoly.components.FieldInstancesPanel.java

Source

/*
 * #!
 * Ontopoly Editor
 * #-
 * Copyright (C) 2001 - 2013 The Ontopia Project
 * #-
 * 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 ontopoly.components;

import java.util.List;

import net.ontopia.utils.OntopiaRuntimeException;
import ontopoly.model.FieldAssignment;
import ontopoly.model.FieldDefinition;
import ontopoly.model.FieldInstance;
import ontopoly.model.FieldsView;
import ontopoly.model.RoleField;
import ontopoly.model.ViewModes;
import ontopoly.models.FieldInstanceModel;
import ontopoly.models.FieldsViewModel;

import org.apache.wicket.Component;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FieldInstancesPanel extends Panel {

    protected static Logger log = LoggerFactory.getLogger(FieldInstancesPanel.class);

    protected boolean readonly;
    private ListView<FieldInstanceModel> listView;

    public FieldInstancesPanel(String id, List<FieldInstanceModel> fieldInstanceModels,
            final FieldsViewModel fieldsViewModel, final boolean readonly, final boolean traversable) {
        super(id);
        this.readonly = readonly;

        listView = new ListView<FieldInstanceModel>("fields", fieldInstanceModels) {
            public void populateItem(final ListItem<FieldInstanceModel> item) {
                FieldInstanceModel fieldInstanceModel = item.getModelObject();
                item.setRenderBodyOnly(true);
                Component component;
                try {
                    component = createFieldInstanceComponent("field", fieldInstanceModel, fieldsViewModel,
                            traversable);
                } catch (Exception e) {
                    log.error("Error occurred while creating field instance component", e);
                    component = new FieldInstanceErrorPanel("field", fieldInstanceModel, e);
                }
                component.setRenderBodyOnly(true);
                item.add(component);
            }
        };
        listView.setReuseItems(true);
        add(listView);
    }

    public ListView<FieldInstanceModel> getFieldList() {
        return listView;
    }

    protected Component createFieldInstanceComponent(String id, FieldInstanceModel fieldInstanceModel,
            FieldsViewModel fieldsViewModel, boolean _traversable) {
        FieldInstance fieldInstance = fieldInstanceModel.getFieldInstance();
        FieldAssignment fieldAssignment = fieldInstance.getFieldAssignment();
        FieldDefinition fieldDefinition = fieldAssignment.getFieldDefinition();
        if (fieldsViewModel == null)
            throw new RuntimeException("Fields view not specified.");

        FieldsView fieldsView = fieldsViewModel.getFieldsView();

        // change from parent view to child view, if specified
        //FieldsView valueView = ofieldModel.getRoleField().getValueView(fieldsViewModel.getFieldsView());
        fieldsView = fieldDefinition.getValueView(fieldsView);
        fieldsViewModel = new FieldsViewModel(fieldsView);

        // given the current view see if it is readonly and/or embedded
        ViewModes viewModes = fieldDefinition.getViewModes(fieldsView);
        final boolean rofield = (readonly || viewModes.isReadOnly());
        final boolean embedded = viewModes.isEmbedded();

        // add field to panel
        switch (fieldDefinition.getFieldType()) {
        case FieldDefinition.FIELD_TYPE_ROLE: {
            RoleField roleField = (RoleField) fieldDefinition;
            int arity = roleField.getAssociationField().getArity();
            // unary
            if (arity == 1) {
                return new FieldInstanceAssociationUnaryPanel(id, fieldInstanceModel, rofield)
                        .setOutputMarkupId(true);
            }
            // binary
            else if (arity == 2) {
                final boolean traversable = (_traversable ? viewModes.isTraversable() : false);

                if (embedded)
                    return new FieldInstanceAssociationBinaryEmbeddedPanel(id, fieldInstanceModel, fieldsViewModel,
                            rofield, traversable).setOutputMarkupId(true);
                else
                    return new FieldInstanceAssociationBinaryPanel(id, fieldInstanceModel, fieldsViewModel, rofield,
                            traversable).setOutputMarkupId(true);
            }
            // n-ary
            else {
                final boolean traversable = (_traversable ? viewModes.isTraversable() : false);
                return new FieldInstanceAssociationNaryPanel(id, fieldInstanceModel, fieldsViewModel, rofield,
                        traversable, arity).setOutputMarkupId(true);
            }
        }
        case FieldDefinition.FIELD_TYPE_IDENTITY: {
            return new FieldInstanceIdentityPanel(id, fieldInstanceModel, rofield);
        }
        case FieldDefinition.FIELD_TYPE_NAME: {
            return new FieldInstanceNamePanel(id, fieldInstanceModel, rofield);
        }
        case FieldDefinition.FIELD_TYPE_OCCURRENCE: {
            return new FieldInstanceOccurrencePanel(id, fieldInstanceModel, rofield);
        }
        case FieldDefinition.FIELD_TYPE_QUERY: {
            final boolean traversable = (_traversable ? viewModes.isTraversable() : false);
            if (embedded)
                return new FieldInstanceQueryEmbeddedPanel(id, fieldInstanceModel, fieldsViewModel, rofield,
                        traversable);
            else
                return new FieldInstanceQueryPanel(id, fieldInstanceModel, fieldsViewModel, rofield, traversable);
        }
        default:
            throw new OntopiaRuntimeException("Unknown field definition: " + fieldDefinition.getFieldType());
        }

    }
}