📄 agentserverconfiggenerator.java
字号:
// if (serverName == null || serverName.equals("")){// serverName = instanceName;// System.out.println("-2- " + serverName);// if (serversNb > 1)// serverName += ("." + serverPrefixName ++);// System.out.println("-3- " + serverName);// } serverElt.setAttribute(NAME, serverName); Short id = new Short(nextId ++); // does this server have a relativeId ? Node idNode = serverElt.getAttributes().getNamedItem(ID); if (idNode != null){ String relId = idNode.getNodeValue(); if (relId != null && (! relId.equals(""))) relativeIds.put(relId, id); } serverElt.setAttribute(ID, id.toString()); NodeList serverChilds = sNode.getChildNodes(); for (int j=0; j<serverChilds.getLength(); j++){ if (serverChilds.item(j).getNodeType() == Node.ELEMENT_NODE) serverElt.appendChild(instantiateElement(root.getOwnerDocument(), instanceName, serverChilds.item(j), p)); } root.appendChild(serverElt); } } for (int i=0; i<childs.getLength(); i++){ Node tNode = childs.item(i); if (tNode.getNodeType() == Node.ELEMENT_NODE && tNode.getNodeName().equals(TRANSIENT_TAG)){ Element transientElt = instantiateElement(root.getOwnerDocument(), instanceName, tNode, p); // check if name have been defined (eg was in a var) String transientName = transientElt.getAttributes().getNamedItem(NAME).getNodeValue(); if (transientName == null || transientName.equals("")){ transientName = instanceName + ".transient"; if (transientNb > 1) transientName += ("." + transientPrefixName ++); transientElt.setAttribute(NAME, transientName); } // generate id Short id = new Short(nextId ++); transientElt.setAttribute(ID, id.toString()); // associated server Node serverNode = transientElt.getAttributes().getNamedItem(SERVER); String associatedServer = null; Short serverId = null; if (serverNode != null) associatedServer = serverNode.getNodeValue(); if (associatedServer == null || associatedServer.equals("")){ // this was not a var associate to first server serverId = firstServer; }else{ serverId = (Short)relativeIds.get(associatedServer); } if (serverId == null){ throw new A3configException("transient " + transientName + " has no associated server"); } transientElt.setAttribute(SERVER, serverId.toString()); NodeList serverChilds = tNode.getChildNodes(); for (int j=0; j<serverChilds.getLength(); j++){ if (serverChilds.item(j).getNodeType() == Node.ELEMENT_NODE) transientElt.appendChild( instantiateElement(root.getOwnerDocument(), instanceName, serverChilds.item(j), p)); } root.appendChild(transientElt); } } return nextId; } private int countChilds(Node currentElt, String tagName){ int nb = 0; NodeList childs = currentElt.getChildNodes(); for (int i=0; i<childs.getLength(); i++){ Node currentNode = childs.item(i); if (currentNode.getNodeType() == Node.ELEMENT_NODE && currentNode.getNodeName().equals(tagName)) nb++; } return nb; } private void buildSimpleElement(String tagName, Element root, Properties p) throws A3configException{ // check if default values for global vars have been initialized if (varsSet.get(GLOBALS) == null) getVariables(templateRoot, false); NodeList childs = templateRoot.getChildNodes(); for (int i=0; i<childs.getLength(); i++){ Node currentNode = childs.item(i); if (currentNode.getNodeType() == Node.ELEMENT_NODE && currentNode.getNodeName().equals(tagName)){ root.appendChild(instantiateElement(root.getOwnerDocument(), null, currentNode, p)); } } } // only for one level private Element instantiateElement(Document doc, String instance, Node model, Properties p) throws A3configException{ Element instanceElt = (Element) doc.importNode(model, false); NamedNodeMap attrs = model.getAttributes(); for (int j=0; j<attrs.getLength(); j++){ Node attrNode = attrs.item(j); String attr = attrs.item(j).getNodeName(); String attrValue = attrs.item(j).getNodeValue(); if (attrNode.getNodeValue().startsWith(VAR_MARK)){ String varName = attrValue.substring(1, attrValue.length()); attrValue = null; // get config in properties if (instance != null) attrValue = p.getProperty(instance + "." + varName); if (attrValue == null) // it may be a global variable attrValue = p.getProperty(varName); if (attrValue == null) // get default attrValue = (String)defaultValues.get(varName); if (attrValue == null) throw new A3configException("Variable " + ((instance!=null) ? instance+"." : "") + varName + " not defined, no defaultValue"); } // add domain info if any if (merge && (! attrValue.equals(TRANSIENT_TAG)) && ((model.getNodeName().equals(NETWORK_TAG) && attr.equals(DOMAIN_TAG)) || (model.getNodeName().equals(DOMAIN_TAG) && attr.equals(NAME)))){ attrValue = currentDomain + "." + attrValue; } instanceElt.setAttribute(attr, attrValue); } return instanceElt; } private ConfigVariable[] getVariables(Node node, boolean type) throws A3configException{ NodeList childs = node.getChildNodes(); Vector v = new Vector(); for (int i=0; i<childs.getLength(); i++){ Node currentNode = childs.item(i); if (currentNode.getNodeType() == Node.ELEMENT_NODE && currentNode.getNodeName().equals(VAR_TAG)){ NamedNodeMap attrs = currentNode.getAttributes(); String name = attrs.getNamedItem(NAME).getNodeValue(); Node valueNode = attrs.getNamedItem(VALUE); String defaultValue = null; if (valueNode != null){ defaultValue = valueNode.getNodeValue(); defaultValues.put(name, defaultValue); } if (!type) continue; Node infoNode = attrs.getNamedItem(INFO); String info = null; if (infoNode != null) info = infoNode.getNodeValue(); try{ Class c = ConfigVariable.getClass( attrs.getNamedItem(TYPE).getNodeValue()); Object defaultObject = null; if (defaultValue != null){ defaultObject = ConfigVariable.getObject(c, defaultValue); } v.addElement(new ConfigVariable(name, c, defaultObject, info)); }catch(Exception e){ throw new A3configException("Error parsing variable type, variable " + name + " has not a valid type"); } } } ConfigVariable[] res = new ConfigVariable[v.size()]; v.copyInto(res); return res; } private void updateConfs(Element localRoot,Element previousRoot, Properties p) throws A3configException{ // add general previous config properties to new config if not re-defined NodeList childs = previousRoot.getChildNodes(); for (int i=0; i<childs.getLength(); i++){ Node currentNode = childs.item(i); if (currentNode.getNodeType() == Node.ELEMENT_NODE && currentNode.getNodeName().equals(PROPERTY_TAG)){ try{ Element oldPropr = getChild(localRoot, PROPERTY_TAG, NAME, ((Element)currentNode).getAttribute(NAME)); }catch(Exception e){ // this property is not redefined in new conf -> redefine it updateImport((Element)currentNode); localRoot.insertBefore( localRoot.getOwnerDocument().importNode(currentNode, true), localRoot.getFirstChild()); } } } // get main domain from D0 Element D0Domain = getChild(previousRoot, DOMAIN_TAG, NAME, ADMIN_DOMAIN); updateImport(D0Domain); // get s0 server Element s0server = getChild(previousRoot, SERVER_TAG, NAME, ADMIN_SERVER_NAME); updateImport(s0server); // get first domain, common to admin an this appli Element newDomain = null; childs = localRoot.getChildNodes(); for (int i=0; i<childs.getLength(); i++){ Node currentNode = childs.item(i); if (currentNode.getNodeType() == Node.ELEMENT_NODE && currentNode.getNodeName().equals(DOMAIN_TAG)){ newDomain = (Element)currentNode; break; } } if (newDomain == null) throw new A3configException("No domain defined"); String newDomainName = newDomain.getAttribute(NAME); // get port for s0 to route new domain String routePort = p.getProperty("domain.port"); if (routePort == null || Integer.parseInt(routePort)<1) throw new A3configException( "No port defined for admin server to route new application"); //check this port is not already defined for a router // (appends when deploy 2 instances with same values checkRouterValid(previousRoot, routePort); // update s0server Element newDomainNetwork = previousRoot.getOwnerDocument().createElement(NETWORK_TAG); newDomainNetwork.setAttribute(DOMAIN_TAG, newDomainName); newDomainNetwork.setAttribute(PORT, routePort); s0server.insertBefore(newDomainNetwork, s0server.getFirstChild()); // add new servers to previousconfig Element firstNewServer = null; for (int i=0; i<childs.getLength(); i++){ Node currentNode = childs.item(i); if (currentNode.getNodeType() == Node.ELEMENT_NODE && currentNode.getNodeName().equals(SERVER_TAG) || currentNode.getNodeName().equals(TRANSIENT_TAG)){ if (firstNewServer == null) firstNewServer = (Element)currentNode; updateImport((Element)currentNode); previousRoot.appendChild( previousRoot.getOwnerDocument().importNode(currentNode, true)); } } // add domain element to previous config updateImport(newDomain); previousRoot.insertBefore( previousRoot.getOwnerDocument().importNode(newDomain, true), s0server); // import s0server in local config and remove useless domains updateImport(s0server); Element localS0server = (Element)(localRoot.getOwnerDocument().importNode(s0server, true)); childs = localS0server.getChildNodes(); for (int i=0; i<childs.getLength(); i++){ Node currentNode = childs.item(i); if (currentNode.getNodeType() == Node.ELEMENT_NODE && currentNode.getNodeName().equals(NETWORK_TAG) && ! currentNode.getAttributes().getNamedItem(DOMAIN_TAG). getNodeValue().equals(ADMIN_DOMAIN) && ! currentNode.getAttributes().getNamedItem(DOMAIN_TAG). getNodeValue().equals(newDomainName)){ localS0server.removeChild(currentNode); } } localRoot.insertBefore(localS0server, firstNewServer); updateImport(D0Domain); localRoot.insertBefore( localRoot.getOwnerDocument().importNode(D0Domain, true), localS0server); } private void checkRouterValid(Element previousRoot, String port) throws A3configException{ Element s0elt = getChild(previousRoot, "server", "id", "0"); NodeList childs = s0elt.getChildNodes(); for (int i=0; i<childs.getLength(); i++){ Node currentNode = childs.item(i); if (currentNode.getNodeType() == Node.ELEMENT_NODE && currentNode.getNodeName().equals(NETWORK_TAG) && currentNode.getAttributes().getNamedItem(PORT).getNodeValue(). equals(port)) throw new A3configException( "The port " + port + " is already defined for domain " + currentNode.getAttributes().getNamedItem(DOMAIN_TAG).getNodeValue()); } } public static void deleteApplicationConfig(InputStream totalConfig, InputStream localConfig, String res) throws Exception{ DOMParser parser = new DOMParser(); parser.parse(new InputSource(totalConfig)); Document resDoc = parser.getDocument(); Element totalRoot = resDoc.getDocumentElement(); parser.parse(new InputSource(localConfig)); Element localRoot = parser.getDocument().getDocumentElement(); // get s0 server of old config Element s0server = getChild(totalRoot, SERVER, NAME, ADMIN_SERVER_NAME); // parse local Element NodeList childs = localRoot.getChildNodes(); for (int i=0; i<childs.getLength(); i++){ Node child = childs.item(i); if (child.getNodeType() == Node.ELEMENT_NODE){ if (child.getNodeName().equals(DOMAIN_TAG)){ String domainName = child.getAttributes().getNamedItem(NAME).getNodeValue(); if (! domainName.equals(ADMIN_DOMAIN)){ // remove domain from total config removeChild(totalRoot, DOMAIN_TAG, NAME, domainName); // remove network from s0server removeChild(s0server, NETWORK_TAG, DOMAIN_TAG, domainName); } }else if (child.getNodeName().equals(SERVER_TAG) || child.getNodeName().equals(TRANSIENT_TAG)){ //remove this server from total config String sid = child.getAttributes().getNamedItem(ID).getNodeValue(); if (! sid.equals("0")) removeChild(totalRoot, child.getNodeName(), ID, sid); } } } // write new config OutputFormat format = new OutputFormat(resDoc); //format.setIndent(indent); FileOutputStream fos = new FileOutputStream(res); XMLSerializer serial = new XMLSerializer(fos, format); serial.asDOMSerializer(); serial.serialize(resDoc); fos.flush(); fos.close(); } private static void removeChild(Element parent, String tagName, String attrName, String attrValue) throws Exception{ NodeList childs = parent.getChildNodes(); for (int i=0; i<childs.getLength(); i++){ Node child = childs.item(i); if (child.getNodeType() == Node.ELEMENT_NODE && child.getNodeName().equals(tagName)){ // check attributes if (child.getAttributes().getNamedItem(attrName). getNodeValue().equals(attrValue)){ parent.removeChild(child); return; } } } throw new Exception("Unable to find tag " + tagName + " with attr " + attrName + "=" + attrValue); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -