/* * Copyright (C) 1999-2008 Jive Software. All rights reserved. * * Licensed 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 * * http://www.apache.org/licenses/LICENSE-2.0 * * 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.jivesoftware.openfire.fastpath.providers; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import org.dom4j.Element; import org.jivesoftware.util.JiveGlobals; import org.jivesoftware.xmpp.workgroup.AgentNotFoundException; import org.jivesoftware.xmpp.workgroup.Workgroup; import org.jivesoftware.xmpp.workgroup.WorkgroupManager; import org.jivesoftware.xmpp.workgroup.WorkgroupProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xmpp.packet.IQ; import org.xmpp.packet.PacketError; /** * MetadataProvider is a generic data handler to retrieve name-value pairs * based from properties files in a given location. To register your own * properties files, you can use the Server Properties feature in the Live Assistant * server and register based on the following naming: config.file0 = location_of_file. */ public class MetadataProvider implements WorkgroupProvider { private static final Logger Log = LoggerFactory.getLogger(MetadataProvider.class); /** * Returns true if the IQ packet name equals "generic-metadata". * * @param packet the IQ GET packet sent to the server. Get packets are sent the * server when a users wishes to retrieve server information. * @return true if it should be handled my MetadataProvider. */ public boolean handleGet(IQ packet) { Element iq = packet.getChildElement(); String name = iq.getName(); return "generic-metadata".equals(name); } /** * Executed if #handleGet returned true. This is responsible for sending * information back to the client. * * @param packet the IQ GET packet sent to the server. * @param workgroup the Workgroup the packet was sent to. */ public void executeGet(IQ packet, Workgroup workgroup) { // Create the generic reply packet. IQ reply = IQ.createResultIQ(packet); // Check that the sender of this IQ is an agent. If so // we throw an item not found exception. WorkgroupManager workgroupManager = WorkgroupManager.getInstance(); try { workgroupManager.getAgentManager().getAgent(packet.getFrom()); } catch (AgentNotFoundException e) { reply.setChildElement(packet.getChildElement().createCopy()); reply.setError(new PacketError(PacketError.Condition.item_not_found)); workgroup.send(reply); return; } // If the sender of the packet is an agent, send back name-value pairs // of all properties files specified. final Map<String, String> map = new HashMap<String, String>(); final List<String> configFiles = JiveGlobals.getProperties("config"); for (String fileName : configFiles) { File file = new File(fileName); if (file.exists()) { // load properties file. Properties props = new Properties(); try { props.load(new FileInputStream(file)); Enumeration<?> properties = props.propertyNames(); while (properties.hasMoreElements()) { String key = (String)properties.nextElement(); String value = props.getProperty(key); map.put(key, value); } } catch (IOException e) { Log.error(e.getMessage(), e); } } } // It is VERY IMPORTANT that you use the same name and namespace as the sending packet. Otherwise, // it would never be mapped correctly. final Element genericSetting = reply.setChildElement("generic-metadata", "http://jivesoftware.com/protocol/workgroup"); for (Map.Entry<String, String> entry : map.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); // Create a name-value element Element element = genericSetting.addElement("entry"); element.addElement("name").setText(key); element.addElement("value").setText(value); } // Send back new packet with requested information. workgroup.send(reply); } /** * Would handle any IQ SET packets if #handleSet returned true. * * @param packet the IQ SET Packet. * @param workgroup the Workgroup the packet was sent to. */ public void executeSet(IQ packet, Workgroup workgroup) { } /** * Would return true if we wished to handle setting of information from client to server. * * @param packet the IQ SET Packet. * @return true if we wish to handle this packet. */ public boolean handleSet(IQ packet) { return false; } }