/**
* Licensed to Apereo under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright ownership. Apereo
* licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use
* this file except in compliance with the License. You may obtain a copy of the License at the
* following location:
*
* <p>http://www.apache.org/licenses/LICENSE-2.0
*
* <p>Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apereo.portal.groups;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.SAXParserFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apereo.portal.utils.ResourceLoader;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
/**
* Parses service descriptions found in the file found at SERVICES_XML. The elements of each service
* are stored in a ComponentGroupServiceDescriptor.
*/
public class GroupServiceConfiguration {
private static final Log log = LogFactory.getLog(GroupServiceConfiguration.class);
// The file containing the configuration:
private static String SERVICES_XML = "/properties/groups/compositeGroupServices.xml";
// Singleton instance.
private static GroupServiceConfiguration configuration;
private GroupConfigurationHandler serviceHandler;
private List serviceDescriptors = new ArrayList();
private Map attributes = new HashMap();
// Handler for parsing the xml source.
class GroupConfigurationHandler extends org.xml.sax.helpers.DefaultHandler {
ComponentGroupServiceDescriptor svcDescriptor;
String elementName;
StringBuffer elementValue;
public void startElement(
String namespaceURI, String localName, String qName, Attributes atts) {
elementName = qName;
elementValue = new StringBuffer();
if (qName.equals("servicelist")) {
log.debug("Parsing group service configuration.");
parseAttributes(atts);
} else if (qName.equals("service")) {
log.debug("Parsing configuration for component service.");
svcDescriptor = new ComponentGroupServiceDescriptor();
for (int i = 0; i < atts.getLength(); i++) {
String name = atts.getQName(i);
String value = atts.getValue(i);
svcDescriptor.put(name, value);
}
}
}
public void endElement(String namespaceURI, String localName, String qName) {
String val = elementValue.toString();
if (qName.equals("service")) {
serviceDescriptors.add(svcDescriptor);
log.debug("Parsed configuration for " + svcDescriptor.getName());
} else if (qName.equals("servicelist")) {
log.debug("Done parsing group service configuration.");
} else if (qName.equals("internally_managed")) {
svcDescriptor.setInternallyManaged("TRUE".equalsIgnoreCase(val));
} else if (qName.equals("caching_enabled")) {
svcDescriptor.setCachingEnabled("TRUE".equalsIgnoreCase(val));
} else {
svcDescriptor.setAttribute(elementName, val);
}
}
public void characters(char ch[], int start, int length) {
if (elementName == null
|| elementName.equals("service")
|| elementName.equals("servicelist")) return;
String chValue = new String(ch, start, length);
elementValue.append(chValue);
}
}
public GroupServiceConfiguration() {
super();
serviceHandler = new GroupConfigurationHandler();
}
public Map getAttributes() {
return attributes;
}
public static synchronized GroupServiceConfiguration getConfiguration() throws Exception {
if (configuration == null) {
configuration = new GroupServiceConfiguration();
configuration.parseXml();
}
return configuration;
}
public String getDefaultService() {
return (String) getAttributes().get("defaultService");
}
public String getNodeSeparator() {
Object nodeSeparator = getAttributes().get("nodeSeparator");
return (nodeSeparator == null) ? IGroupConstants.NODE_SEPARATOR : (String) nodeSeparator;
}
public List getServiceDescriptors() {
return serviceDescriptors;
}
protected void parseAttributes(Attributes atts) {
String name, value;
for (int i = 0; i < atts.getLength(); i++) {
name = atts.getQName(i);
value = atts.getValue(i);
getAttributes().put(name, value);
}
}
protected void parseXml() throws Exception {
InputSource xmlSource =
new InputSource(
ResourceLoader.getResourceAsStream(
GroupServiceConfiguration.class, SERVICES_XML));
if (xmlSource != null) {
XMLReader reader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
reader.setContentHandler(serviceHandler);
reader.parse(xmlSource);
}
}
}