package net.whydah.admin.application; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Joiner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathFactory; import java.io.IOException; import java.io.StringReader; import java.util.ArrayList; import java.util.List; /** * Application. * * Erik's notes: * * applications * application, applicationID, name * relations (organisation) * relation1, id, name * properties / hashmap (mappet tidligere til roller) * relation2, id, name * properties / hashmap * */ public class Application { private static final Logger log = LoggerFactory.getLogger(Application.class); private String id; private String name; private String defaultRole; private String defaultOrgid; private List<String> availableOrgIds = new ArrayList<>(); private Application() { } public Application(String id, String name) { this(id, name, null, null); } public Application(String id, String name, String defaultRole, String defaultOrgid) { this.id = id; this.name = name; this.defaultRole = defaultRole; this.defaultOrgid = defaultOrgid; } public Application(String id, String name, String defaultRole, String defaultOrgid, List<String> availableOrgIds) { this.id = id; this.name = name; this.defaultRole = defaultRole; this.defaultOrgid = defaultOrgid; setAvailableOrgIds(availableOrgIds); } /** * { "id": "id1", "name": "test", "defaultRole": "default1role", "defaultOrgid": "defaultorgid", "availableOrgIds": [ "developer@customer", "consultant@customer" ] } * @param applicationJson * @return */ public static Application fromJson(String applicationJson) { try { Application application; ObjectMapper mapper = new ObjectMapper(); application = mapper.readValue(applicationJson, Application.class); return application; } catch (JsonMappingException e) { throw new IllegalArgumentException("Error mapping json for " + applicationJson, e); } catch (JsonParseException e) { throw new IllegalArgumentException("Error parsing json for " + applicationJson, e); } catch (IOException e) { throw new IllegalArgumentException("Error reading json for " + applicationJson, e); } } public String toJson() { String applicationJson = null; ObjectMapper mapper = new ObjectMapper(); try { applicationJson = mapper.writeValueAsString(this); } catch (IOException e) { log.info("Could not create json from this object {}", toString(), e); } return applicationJson; } public String toXML() { return "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?> \n " + " <application>\n" + " <applicationid>" + id + "</applicationid>\n" + " <applicationname>" + name + "</applicationname>\n" + " <defaultrole>" + defaultRole + "</defaultrole>\n" + " <defaultorgid>" + defaultOrgid + "</defaultorgid>\n" + " " + buildAvailableOrgIsXml() + "\n" + " </application>\n"; } private String buildAvailableOrgIsXml() { StringBuilder availableXml = new StringBuilder("<availableOrgIds>\n"); for (String availableOrgId : availableOrgIds) { availableXml.append("<orgId>" + availableOrgId + "</orgId>\n"); } availableXml.append("</availableOrgIds>"); return availableXml.toString(); } public static Application fromXml(String applicationXml) { log.debug("Build application from xml {}", applicationXml); Application application = null; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { DocumentBuilder documentBuilder = dbf.newDocumentBuilder(); Document doc = documentBuilder.parse(new InputSource(new StringReader(applicationXml))); XPath xPath = XPathFactory.newInstance().newXPath(); String id = (String) xPath.evaluate("/application/applicationid", doc, XPathConstants.STRING); String name = (String) xPath.evaluate("/application/applicationname", doc, XPathConstants.STRING); String defaultrole = (String) xPath.evaluate("/application/defaultrole", doc, XPathConstants.STRING); String defaultorgid = (String) xPath.evaluate("/application/defaultorgid", doc, XPathConstants.STRING); NodeList availableOrgIds = (NodeList) xPath.evaluate("/application/availableOrgIds/orgId", doc, XPathConstants.NODESET); application = new Application(id,name,defaultrole, defaultorgid); if (availableOrgIds != null && availableOrgIds.getLength() > 0) { for (int i = 0; i < availableOrgIds.getLength(); i++) { Node node = availableOrgIds.item(i); XPathExpression pathExpr = xPath.compile("."); String orgId = (String) pathExpr.evaluate(node, XPathConstants.STRING); log.debug("orgId {}", orgId); application.addAvailableOrgId(orgId); } } } catch (Exception e) { log.warn("Could not create an Application from this xml {}", applicationXml, e); } return application; } public String getId() { return id; } public String getName() { return name; } public String getDefaultRole() { return defaultRole; } public String getDefaultOrgid() { return defaultOrgid; } public List<String> getAvailableOrgIds() { return availableOrgIds; } public void setAvailableOrgIds(List<String> availableOrgIds) { if (availableOrgIds != null) { this.availableOrgIds = availableOrgIds; } } public void addAvailableOrgId(String availableOrgId) { if (availableOrgIds == null) { availableOrgIds = new ArrayList(); } if (availableOrgId != null) { this.availableOrgIds.add(availableOrgId); } } public void removeAvailableOrgId(String availableOrgId) { if (availableOrgIds != null && availableOrgId != null) { availableOrgIds.remove(availableOrgId); } } public void setDefaultOrgid(String defaultOrgid) { this.defaultOrgid = defaultOrgid; } public void setDefaultRole(String defaultRole) { this.defaultRole = defaultRole; } @Override public String toString() { String availableIdsString = ""; if (this.availableOrgIds != null) { availableIdsString = Joiner.on(", ").join(this.availableOrgIds); } return "Application{" + "appId='" + id + '\'' + ", name='" + name + '\'' + ", defaultrole='" + defaultRole + '\'' + ", defaultOrgid='" + defaultOrgid + '\'' + ", availableOrgIds = '" + availableIdsString + '\'' + '}'; } public void setId(String id) { this.id = id; } }