/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.plugins.modcluster.model; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Simple parser for the raw proxy information provided by mod_cluster. * * @author Stefan Negrea */ public class ProxyInfo { private Map<String, Node> availableNodes = new HashMap<String, Node>(); private Map<String, Vhost> availableVhosts = new HashMap<String, Vhost>(); private List<Context> availableContexts = new ArrayList<ProxyInfo.Context>(); public ProxyInfo(String rawProxyInfo) { parseNodes(rawProxyInfo); parseVhosts(rawProxyInfo); parseContexts(rawProxyInfo); } private void parseNodes(String rawProxyInfo) { Pattern nodePattern = Pattern.compile("Node:.*\n"); Matcher nodeMatcher = nodePattern.matcher(rawProxyInfo); while (nodeMatcher.find()) { String rawNode = nodeMatcher.group(); String[] nodePieces = rawNode.split(","); String identifier = nodePieces[0]; identifier = identifier.substring(identifier.indexOf("[") + 1, identifier.indexOf("]")); String jvmRoute = nodePieces[1]; jvmRoute = jvmRoute.substring(jvmRoute.indexOf(':') + 1).trim(); availableNodes.put(identifier, new Node(jvmRoute, identifier)); } } private void parseVhosts(String rawProxyInfo) { Pattern vhostPattern = Pattern.compile("Vhost:.*\n"); Matcher vhostMatcher = vhostPattern.matcher(rawProxyInfo); while (vhostMatcher.find()) { String rawVhost = vhostMatcher.group(); String[] vhostPieces = rawVhost.split(","); String identifier = vhostPieces[0].trim(); identifier = identifier.substring(identifier.indexOf("[") + 1, identifier.indexOf("]")); identifier = identifier.substring(0, identifier.lastIndexOf(":")); String host = vhostPieces[1].trim(); host = host.substring(host.indexOf(":") + 1).trim(); availableVhosts.put(identifier, new Vhost(identifier, host)); } } private void parseContexts(String rawProxyInfo) { Pattern contextPattern = Pattern.compile("Context:.*[\n|}]"); Matcher contextMatcher = contextPattern.matcher(rawProxyInfo); while (contextMatcher.find()) { String rawContext = contextMatcher.group(); String[] contextPieces = rawContext.split(","); String actualContext = contextPieces[1].substring(contextPieces[1].indexOf("/")).trim(); String identifier = contextPieces[0]; identifier = identifier.substring(identifier.indexOf("[") + 1, identifier.indexOf("]")); identifier = identifier.substring(0, identifier.lastIndexOf(":")); String nodeIdentifier = contextPieces[0]; nodeIdentifier = nodeIdentifier.substring(nodeIdentifier.indexOf("[") + 1, nodeIdentifier.indexOf("]")); nodeIdentifier = nodeIdentifier.substring(0, nodeIdentifier.indexOf(":")); String jvmRoute = availableNodes.get(nodeIdentifier).getJvmRoute(); String rawIsEnabled = contextPieces[2]; rawIsEnabled = rawIsEnabled.substring(rawIsEnabled.indexOf(':') + 1).trim(); boolean isEnabled = rawIsEnabled.equals("ENABLED") ? true : false; Vhost relatedVhost = availableVhosts.get(identifier); availableContexts.add(new Context(jvmRoute, relatedVhost.getHost(), actualContext, isEnabled)); } } public List<Context> getAvailableContexts() { return Collections.unmodifiableList(availableContexts); } public List<Vhost> getAvailableVhosts() { return Collections.unmodifiableList(new ArrayList<Vhost>(availableVhosts.values())); } public List<Node> getAvailableNodes() { return Collections.unmodifiableList(new ArrayList<Node>(availableNodes.values())); } public static class Node { private String jvmRoute; private String nodeId; public Node(String jvmRoute, String nodeId) { this.jvmRoute = jvmRoute; this.nodeId = nodeId; } public String getNodeId() { return nodeId; } public String getJvmRoute() { return jvmRoute; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((jvmRoute == null) ? 0 : jvmRoute.hashCode()); result = prime * result + ((nodeId == null) ? 0 : nodeId.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Node other = (Node) obj; if (jvmRoute == null) { if (other.jvmRoute != null) return false; } else if (!jvmRoute.equals(other.jvmRoute)) return false; if (nodeId == null) { if (other.nodeId != null) return false; } else if (!nodeId.equals(other.nodeId)) return false; return true; } } public static class Vhost { private String identifier; private String host; public Vhost(String identifier, String host) { this.identifier = identifier; this.host = host; } public String getIdentifier() { return identifier; } public String getHost() { return host; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((host == null) ? 0 : host.hashCode()); result = prime * result + ((identifier == null) ? 0 : identifier.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Vhost other = (Vhost) obj; if (host == null) { if (other.host != null) return false; } else if (!host.equals(other.host)) return false; if (identifier == null) { if (other.identifier != null) return false; } else if (!identifier.equals(other.identifier)) return false; return true; } } public static class Context { private String path; private String host; private String jvmRoute; private boolean isEnabled; public Context(String jvmRoute, String host, String path) { this(jvmRoute, host, path, false); } public Context(String jvmRoute, String host, String path, boolean isEnabled) { this.jvmRoute = jvmRoute; this.host = host; this.path = path; this.isEnabled = isEnabled; } public String getPath() { return path; } public String getHost() { return host; } public String getJvmRoute() { return jvmRoute; } public boolean isEnabled() { return isEnabled; } public String createKey() { return jvmRoute + ":" + host + ":" + path; } public String createName() { return host + ":" + path; } @Override public String toString() { return createKey(); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((host == null) ? 0 : host.hashCode()); result = prime * result + ((jvmRoute == null) ? 0 : jvmRoute.hashCode()); result = prime * result + ((path == null) ? 0 : path.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Context other = (Context) obj; if (host == null) { if (other.host != null) return false; } else if (!host.equals(other.host)) return false; if (jvmRoute == null) { if (other.jvmRoute != null) return false; } else if (!jvmRoute.equals(other.jvmRoute)) return false; if (path == null) { if (other.path != null) return false; } else if (!path.equals(other.path)) return false; return true; } public static Context fromString(String stringRepresentation) throws Exception { String parts[] = stringRepresentation.trim().split(":"); if (parts.length < 3) { throw new Exception("Parsing error. Not enough information to create a context."); } return new Context(parts[0], parts[1], parts[2]); } } }