/**
* Copyright © ${project.inceptionYear} Instituto Superior Técnico
*
* This file is part of Fenix IST.
*
* Fenix IST is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Fenix IST is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Fenix IST. If not, see <http://www.gnu.org/licenses/>.
*/
package pt.ist.fenix.ui.struts.action.externalServices;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import pt.ist.fenixframework.DomainObject;
import pt.ist.fenixframework.FenixFramework;
import pt.ist.fenixframework.core.AbstractDomainObject;
import pt.ist.fenixframework.dml.DomainClass;
import pt.ist.fenixframework.dml.DomainModel;
import pt.ist.fenixframework.dml.Role;
import pt.ist.fenixframework.dml.Slot;
public class DomainObjectJSONSerializer {
private static DomainModel model;
static {
model = FenixFramework.getDomainModel();
}
public static JSONObject getDomainObject(DomainObject obj) throws SecurityException, NoSuchMethodException,
IllegalArgumentException, IllegalAccessException, InvocationTargetException {
final JSONObject jsonObject = new JSONObject();
final Class<? extends DomainObject> clazz = obj.getClass();
final String objClassName = clazz.getName();
jsonObject.put("externalId", obj.getExternalId());
jsonObject.put("className", objClassName);
final DomainClass domainClass = getDomainClass(objClassName);
if (domainClass == null) {
return jsonObject;
}
for (Slot slot : getAllSlots(domainClass)) {
final String slotName = slot.getName();
final Method method = clazz.getMethod("get" + StringUtils.capitalize(slotName));
final Object result = method.invoke(obj);
jsonObject.put(slotName, result == null ? null : result.toString());
}
for (Role roleSlot : getAllRoleSlots(domainClass)) {
final String slotName = roleSlot.getName();
if (roleSlot.getMultiplicityUpper() == 1) {
final Method method = clazz.getMethod("get" + StringUtils.capitalize(slotName));
final AbstractDomainObject singleRelationObj = (AbstractDomainObject) method.invoke(obj);
final JSONArray oneRelation = new JSONArray();
if (singleRelationObj != null) {
oneRelation.add(singleRelationObj.getExternalId());
}
jsonObject.put(slotName, oneRelation);
} else {
final Method method = clazz.getMethod("get" + StringUtils.capitalize(slotName) + "Set");
final Set<? extends AbstractDomainObject> result = (Set<? extends AbstractDomainObject>) method.invoke(obj);
jsonObject.put(slotName, serializeRelation(result));
}
}
return jsonObject;
}
private static JSONArray serializeRelation(Set<? extends AbstractDomainObject> roleSet) {
JSONArray jsonList = new JSONArray();
for (AbstractDomainObject obj : roleSet) {
jsonList.add(obj.getExternalId());
}
return jsonList;
}
private static DomainClass getDomainClass(String objClassName) {
for (DomainClass clazz : model.getDomainClasses()) {
if (clazz.getFullName().equals(objClassName)) {
return clazz;
}
}
return null;
}
private static List<Slot> getAllSlots(DomainClass clazz) {
final List<Slot> slots = new ArrayList<Slot>();
if (clazz.hasSuperclass()) {
slots.addAll(getAllSlots((DomainClass) clazz.getSuperclass()));
}
slots.addAll(clazz.getSlotsList());
return slots;
}
private static List<Role> getAllRoleSlots(DomainClass clazz) {
final List<Role> slots = new ArrayList<Role>();
if (clazz.hasSuperclass()) {
slots.addAll(getAllRoleSlots((DomainClass) clazz.getSuperclass()));
}
slots.addAll(clazz.getRoleSlotsList());
return slots;
}
}