/*
* #!
* 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());
}
}
}