001: /*
002: * JBoss, Home of Professional Open Source
003: * Copyright 2005, JBoss Inc., and individual contributors as indicated
004: * by the @authors tag. See the copyright.txt in the distribution for a
005: * full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jbpm.identity.xml;
023:
024: import java.io.InputStream;
025: import java.util.ArrayList;
026: import java.util.HashMap;
027: import java.util.Iterator;
028: import java.util.List;
029: import java.util.Map;
030:
031: import org.dom4j.Document;
032: import org.dom4j.DocumentException;
033: import org.dom4j.Element;
034: import org.dom4j.io.SAXReader;
035: import org.jbpm.identity.Entity;
036: import org.jbpm.identity.Group;
037: import org.jbpm.identity.Membership;
038: import org.jbpm.identity.User;
039: import org.jbpm.util.ClassLoaderUtil;
040:
041: public class IdentityXmlParser {
042:
043: List entities = new ArrayList();
044: Map users = new HashMap();
045: Map groups = new HashMap();
046:
047: public static Entity[] parseEntitiesResource(String resource) {
048: return new IdentityXmlParser().parse(resource);
049: }
050:
051: public static Entity[] parseEntitiesResource(InputStream inputStream) {
052: return new IdentityXmlParser().parse(inputStream);
053: }
054:
055: public Entity[] parse(String resource) {
056: return parse(ClassLoaderUtil.getStream(resource));
057: }
058:
059: public Entity[] parse(InputStream inputStream) {
060: Document document;
061: try {
062: document = new SAXReader().read(inputStream);
063: } catch (DocumentException e) {
064: throw new RuntimeException(
065: "couldn't parse identities from stream '"
066: + inputStream + "'");
067: }
068: Element identitiesRootElement = document.getRootElement();
069:
070: readUsers(identitiesRootElement.elements("user"));
071: readGroups(identitiesRootElement.elements("group"));
072: readParentGroups(identitiesRootElement.elements("group"));
073: readMemberships(identitiesRootElement.elements("membership"));
074:
075: return (Entity[]) entities.toArray(new Entity[entities.size()]);
076: }
077:
078: private void readUsers(List userElements) {
079: Iterator iter = userElements.iterator();
080: while (iter.hasNext()) {
081: Element userElement = (Element) iter.next();
082: String name = userElement.attributeValue("name");
083: String email = userElement.attributeValue("email");
084: String password = userElement.attributeValue("password");
085:
086: User user = new User(name);
087: user.setEmail(email);
088: user.setPassword(password);
089: users.put(name, user);
090: entities.add(user);
091: }
092: }
093:
094: private void readGroups(List groupElements) {
095: Iterator iter = groupElements.iterator();
096: while (iter.hasNext()) {
097: Element groupElement = (Element) iter.next();
098: String name = groupElement.attributeValue("name");
099: String type = groupElement.attributeValue("type");
100:
101: Group group = new Group(name);
102: group.setType(type);
103: entities.add(group);
104: groups.put(name, group);
105: }
106: }
107:
108: private void readParentGroups(List groupElements) {
109: Iterator iter = groupElements.iterator();
110: while (iter.hasNext()) {
111: Element groupElement = (Element) iter.next();
112: String childName = groupElement.attributeValue("name");
113: String parentName = groupElement.attributeValue("parent");
114:
115: if (parentName != null) {
116: Group parent = (Group) groups.get(parentName);
117: if (parent == null)
118: throw new RuntimeException(
119: "unexisting parent group '" + parentName
120: + "'");
121: Group child = (Group) groups.get(childName);
122:
123: parent.addChild(child);
124: }
125: }
126: }
127:
128: private void readMemberships(List membershipElements) {
129: Iterator iter = membershipElements.iterator();
130: while (iter.hasNext()) {
131: Element membershipElement = (Element) iter.next();
132: String role = membershipElement.attributeValue("role");
133: String userName = membershipElement.attributeValue("user");
134: User user = (User) users.get(userName);
135: if (user == null)
136: throw new RuntimeException(
137: "unexisting membership user '" + userName + "'");
138: String groupName = membershipElement
139: .attributeValue("group");
140: Group group = (Group) groups.get(groupName);
141: if (group == null)
142: throw new RuntimeException(
143: "unexisting membership group '" + groupName
144: + "'");
145:
146: Membership membership = new Membership();
147: membership.setRole(role);
148: group.addMembership(membership);
149: user.addMembership(membership);
150:
151: entities.add(membership);
152: }
153: }
154: }
|