/*
* Copyright (c) 2002-2003 by OpenSymphony
* All rights reserved.
*/
package com.opensymphony.user.provider.file;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.Iterator;
class XMLGroupsCache extends FileGroupsCache {
//~ Static fields/initializers /////////////////////////////////////////////
protected static final Log log = LogFactory.getLog(XMLGroupsCache.class);
//~ Constructors ///////////////////////////////////////////////////////////
public XMLGroupsCache(String storeFile, String storeFileType) {
super(storeFile, storeFileType);
load();
}
//~ Methods ////////////////////////////////////////////////////////////////
public boolean load() {
try {
// clear the groups first
groups = new HashMap();
SAXReader reader = new SAXReader();
Document document = null;
document = reader.read(getInputStreamFromStoreFile());
Element root = document.getRootElement();
if (log.isDebugEnabled()) {
log.debug("loaded " + storeFile);
}
// read each <group>
for (Iterator i = root.elementIterator(); i.hasNext();) {
Element groupElement = (Element) i.next();
if (groupElement.getName().equals("group")) {
String groupName = groupElement.attribute("id").getValue();
FileGroup group = new FileGroup();
group.name = groupName;
// read
for (Iterator j = groupElement.elementIterator();
j.hasNext();) {
Element userElement = (Element) j.next();
if (userElement.getName().equals("user")) {
String userName = userElement.attribute("id").getValue();
group.users.add(userName);
log.debug("added user " + userName + " to group " + groupName);
} else {
log.warn("expected 'user' element, found " + userElement.getName() + " in " + storeFile);
}
}
groups.put(groupName, group);
log.debug("added group " + groupName);
} else {
log.warn("expected 'group' element, found " + groupElement.getName() + " in " + storeFile);
}
}
return true;
} catch (Exception e) {
log.fatal("cannot load from " + storeFile + ".", e);
}
return false;
}
public boolean store() {
try {
Document document = DocumentHelper.createDocument();
Element root = document.addElement("groups");
// a <group id="foo"> for each group
for (Iterator i = groups.keySet().iterator(); i.hasNext();) {
String groupKey = i.next().toString();
FileGroup group = (FileGroup) groups.get(groupKey);
Element groupElement = root.addElement("group").addAttribute("id", group.name);
// a <user id="bar"/> for each group's member
for (Iterator j = group.users.iterator(); j.hasNext();) {
groupElement.addElement("user").addAttribute("id", j.next().toString());
}
}
// print it nicely
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileWriter(storeFile));
writer.write(document);
writer.close();
return true;
} catch (Exception e) {
log.fatal("cannot store in file " + storeFile + ".", e);
}
return false;
}
}