/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.eas.client.scripts;
import com.eas.client.Application;
import com.eas.client.cache.ServerDataStorage;
import com.eas.client.model.application.ApplicationDbEntity;
import com.eas.client.model.application.ApplicationDbModel;
import com.eas.client.model.application.ApplicationModel;
import com.eas.client.model.application.ApplicationPlatypusEntity;
import com.eas.client.model.application.ApplicationPlatypusModel;
import com.eas.client.model.store.XmlDom2ApplicationModel;
import com.eas.client.queries.LocalQueriesProxy;
import com.eas.client.queries.RemoteQueriesProxy;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
*
* @author mg
*/
public class ApplicationModelLoader {
public static ApplicationModel<?, ?> load(Document aDoc, String aModuleName, Application<?> aApp) {
Element modelElement = aModuleName != null ? findModelElementByBundleName(aDoc.getDocumentElement(), aModuleName) : aDoc.getDocumentElement();
if (aApp.getQueries() instanceof LocalQueriesProxy) {
LocalQueriesProxy localQueries = (LocalQueriesProxy) aApp.getQueries();
ApplicationDbModel model = new ApplicationDbModel(localQueries.getCore(), localQueries);
XmlDom2ApplicationModel<ApplicationDbEntity, ApplicationDbModel> parser = new XmlDom2ApplicationModel<>(modelElement);
parser.visit(model);
return model;
} else {
RemoteQueriesProxy remoteQueries = (RemoteQueriesProxy) aApp.getQueries();
assert aApp instanceof ServerDataStorage;
ApplicationPlatypusModel model = new ApplicationPlatypusModel((ServerDataStorage) aApp, remoteQueries);
XmlDom2ApplicationModel<ApplicationPlatypusEntity, ApplicationPlatypusModel> parser = new XmlDom2ApplicationModel<>(modelElement);
parser.visit(model);
return model;
}
}
private static Element findModelElementByBundleName(Element aElement, String aBundleName) {
if (aElement.getTagName().equals("datamodel")) {
return aElement;// the high level code had to do everything in the right way
} else {
Node child = aElement.getFirstChild();
while (child != null) {
if (child instanceof Element) {
Element el = (Element) child;
if (el.hasAttribute("bundle-name")) {
String bundleName = el.getAttribute("bundle-name");
if (bundleName.equals(aBundleName)) {
return el;
}
}
}
child = child.getNextSibling();
}
}
return null;
}
}