/*
* #!
* 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.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import ontopoly.model.AssociationType;
import ontopoly.model.RoleType;
import ontopoly.models.AssociationTypeModel;
import ontopoly.models.ListModel;
import ontopoly.models.RoleTypeModel;
import ontopoly.models.TopicModel;
import ontopoly.pages.AssociationTransformPage;
import org.apache.wicket.PageParameters;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.ResourceModel;
public class AssociationTransformerPanel extends Panel {
private String topicMapId;
private AssociationTypeModel associationTypeModel;
private ListModel<RoleTypeModel,String> roleTypesModel;
private IModel<List<RoleType>> declaredRoleTypesModel;
private List<TopicModel<RoleType>> selectedModels = new ArrayList<TopicModel<RoleType>>();
public AssociationTransformerPanel(String id, AssociationType associationType, List<RoleType> roleTypes) {
super(id);
this.associationTypeModel = new AssociationTypeModel(associationType);
this.topicMapId = associationType.getTopicMap().getId();
this.setOutputMarkupId(true);
// make list serializable by storing only object ids
int size = roleTypes.size();
List<String> objectIds = new ArrayList<String>(size);
for (int i=0; i < size; i++) {
RoleType rtype = roleTypes.get(i);
objectIds.add(rtype.getId());
}
this.roleTypesModel = new ListModel<RoleTypeModel,String>(objectIds) {
@Override
protected RoleTypeModel getObjectFor(String topicId) {
return new RoleTypeModel(topicMapId, topicId);
}
};
this.declaredRoleTypesModel = new LoadableDetachableModel<List<RoleType>>() {
@Override
public List<RoleType> load() {
return associationTypeModel.getAssociationType().getDeclaredRoleTypes();
}
};
RepeatingView rview = new RepeatingView("roletype");
Iterator<RoleType> riter = roleTypes.iterator();
while (riter.hasNext()) {
RoleType roleType = riter.next();
WebMarkupContainer rcontainer = new WebMarkupContainer(rview.newChildId());
rcontainer.add(new Label("oldvalue", roleType.getName()));
TopicModel<RoleType> selectedModel = new TopicModel<RoleType>(null, TopicModel.TYPE_ROLE_TYPE);
selectedModels.add(selectedModel);
TopicDropDownChoice<RoleType> choice = new TopicDropDownChoice<RoleType>("newvalue", selectedModel, declaredRoleTypesModel);
choice.add(new AjaxFormComponentUpdatingBehavior("onchange") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
// target.addComponent(AssociationTransformerPanel.this);
}
});
rcontainer.add(choice);
rview.add(rcontainer);
}
add(rview);
Button transformButton = new Button("button", new ResourceModel("button.association.transform"));
transformButton.add(new AjaxFormComponentUpdatingBehavior("onclick") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
// System.out.println("Button clicked");
boolean validCombination = true;
List<RoleType> declaredRoleTypes = declaredRoleTypesModel.getObject();
List<RoleType> unusedRoleTypes = new ArrayList<RoleType>(declaredRoleTypes); // make copy
int size = selectedModels.size();
for (int i=0; i < size; i++) {
TopicModel<RoleType> model = selectedModels.get(i);
RoleType selected = (RoleType)model.getObject();
// System.out.println("S: " + selected);
if (selected == null) {
validCombination = false;
break;
} else {
unusedRoleTypes.remove(selected);
}
}
if (validCombination && unusedRoleTypes.isEmpty()) {
List<RoleTypeModel> roleTypesModels = roleTypesModel.getObject();
List<RoleType> roleTypesFrom = new ArrayList<RoleType>(size);
List<RoleType> roleTypesTo = new ArrayList<RoleType>(size);
for (int i=0; i < size; i++) {
roleTypesFrom.add(roleTypesModels.get(i).getRoleType());
roleTypesTo.add(selectedModels.get(i).getObject());
}
// System.out.println("FROM: " + roleTypesFrom);
// System.out.println("TO: " + roleTypesTo);
AssociationType at = associationTypeModel.getAssociationType();
at.transformInstances(roleTypesFrom, roleTypesTo);
// redirect to same page
Map<String,String> pageParametersMap = new HashMap<String,String>();
pageParametersMap.put("topicMapId", at.getTopicMap().getId());
pageParametersMap.put("topicId", at.getId());
setResponsePage(AssociationTransformPage.class, new PageParameters(pageParametersMap));
setRedirect(true);
}
}
});
add(transformButton);
}
@Override
public void onDetach() {
associationTypeModel.detach();
roleTypesModel.detach();
declaredRoleTypesModel.detach();
super.onDetach();
}
}