/* * TeleStax, Open Source Cloud Communications * Copyright 2012, Telestax Inc and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.mobicents.smsc.domain; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import javax.management.InstanceAlreadyExistsException; import javax.management.InstanceNotFoundException; import javax.management.MBeanRegistrationException; import javax.management.MBeanServer; import javax.management.MalformedObjectNameException; import javax.management.NotCompliantMBeanException; import javax.management.ObjectName; import javax.management.StandardMBean; import javolution.text.TextBuilder; import javolution.util.FastList; import javolution.xml.XMLBinding; import javolution.xml.XMLObjectReader; import javolution.xml.XMLObjectWriter; import javolution.xml.stream.XMLStreamException; import org.apache.log4j.Logger; import org.jboss.mx.util.MBeanServerLocator; /** * * @author sergey vetyutnev * */ public class HttpUsersManagement implements HttpUsersManagementMBean { private static final Logger logger = Logger.getLogger(HttpUsersManagement.class); private static final String USER_LIST = "userList"; private static final String TAB_INDENT = "\t"; private static final String CLASS_ATTRIBUTE = "type"; private static final XMLBinding binding = new XMLBinding(); private static final String PERSIST_FILE_NAME = "httpusers.xml"; private final String name; private String persistDir = null; protected FastList<HttpUser> httpUsers = new FastList<HttpUser>(); private final TextBuilder persistFile = TextBuilder.newInstance(); private MBeanServer mbeanServer = null; private static HttpUsersManagement instance = null; protected HttpUsersManagement(String name) { this.name = name; binding.setClassAttribute(CLASS_ATTRIBUTE); binding.setAlias(HttpUser.class, "httpUser"); } public static HttpUsersManagement getInstance(String name) { if (instance == null) { instance = new HttpUsersManagement(name); } return instance; } public static HttpUsersManagement getInstance() { return instance; } public String getName() { return name; } public String getPersistDir() { return persistDir; } public void setPersistDir(String persistDir) { this.persistDir = persistDir; } @Override public FastList<HttpUser> getHttpUsers() { return httpUsers; } @Override public HttpUser getHttpUserByName(String userName) { for (FastList.Node<HttpUser> n = httpUsers.head(), end = httpUsers.tail(); (n = n.getNext()) != end;) { HttpUser httpUser = n.getValue(); if (httpUser.getUserName().equals(userName)) { return httpUser; } } return null; } @Override public HttpUser createHttpUser(String userName, String password, final int aNetworkId) throws Exception { if (userName == null || userName.isEmpty()) { throw new Exception("userName must not be null or an empty String"); } // if (password == null || password.isEmpty()) { // throw new Exception("password must not be null or an empty String"); // } for (FastList.Node<HttpUser> n = httpUsers.head(), end = httpUsers.tail(); (n = n.getNext()) != end;) { HttpUser httpUser = n.getValue(); // Name should be unique if (httpUser.getUserName().equals(userName)) { throw new Exception(String.format(SMSCOAMMessages.CREATE_HTTPUSER_FAIL_ALREADY_EXIST, name)); } } HttpUser httpUser = new HttpUser(userName, password, aNetworkId); httpUser.httpUsersManagement = this; httpUsers.add(httpUser); this.store(); this.registerHttpUserMbean(httpUser); return httpUser; } @Override public HttpUser destroyHttpUser(String userName) throws Exception { HttpUser httpUser = this.getHttpUserByName(userName); if (httpUser == null) { throw new Exception(String.format(SMSCOAMMessages.DELETE_HTTPUSER_FAILED_NO_HTTPUSERFOUND, userName)); } httpUsers.remove(httpUser); this.store(); this.unregisterHttpUserMbean(httpUser.getUserName()); return httpUser; } public void start() throws Exception { logger.info("Starting of HttpUsersManagement"); try { this.mbeanServer = MBeanServerLocator.locateJBoss(); } catch (Exception e) { } this.persistFile.clear(); if (persistDir != null) { this.persistFile.append(persistDir).append(File.separator).append(this.name).append("_") .append(PERSIST_FILE_NAME); } else { persistFile .append(System.getProperty(SmscManagement.SMSC_PERSIST_DIR_KEY, System.getProperty(SmscManagement.USER_DIR_KEY))).append(File.separator).append(this.name) .append("_").append(PERSIST_FILE_NAME); } logger.info(String.format("Loading HttpUser configuration from %s", persistFile.toString())); try { this.load(); } catch (FileNotFoundException e) { logger.warn(String.format("Failed to load the HttpUser configuration file. \n%s", e.getMessage())); } for (FastList.Node<HttpUser> n = httpUsers.head(), end = httpUsers.tail(); (n = n.getNext()) != end;) { HttpUser httpUser = n.getValue(); this.registerHttpUserMbean(httpUser); } logger.info("Started of HttpUsersManagement"); } public void stop() throws Exception { logger.info("Stopping of HttpUsersManagement"); this.store(); for (FastList.Node<HttpUser> n = httpUsers.head(), end = httpUsers.tail(); (n = n.getNext()) != end;) { HttpUser httpUser = n.getValue(); this.unregisterHttpUserMbean(httpUser.getUserName()); } logger.info("Stopped of HttpUsersManagement"); } /** * Persist */ public void store() { try { XMLObjectWriter writer = XMLObjectWriter.newInstance(new FileOutputStream(persistFile.toString())); writer.setBinding(binding); // Enables cross-references. // writer.setReferenceResolver(new XMLReferenceResolver()); writer.setIndentation(TAB_INDENT); writer.write(httpUsers, USER_LIST, FastList.class); writer.close(); } catch (Exception e) { logger.error("Error while persisting httpUsers state in file", e); } } /** * Load and create LinkSets and Link from persisted file * * @throws Exception */ public void load() throws FileNotFoundException { XMLObjectReader reader = null; try { reader = XMLObjectReader.newInstance(new FileInputStream(persistFile.toString())); reader.setBinding(binding); this.httpUsers = reader.read(USER_LIST, FastList.class); reader.close(); for (FastList.Node<HttpUser> n = httpUsers.head(), end = httpUsers.tail(); (n = n.getNext()) != end;) { HttpUser httpUser = n.getValue(); httpUser.httpUsersManagement = this; } } catch (XMLStreamException ex) { // this.logger.info( // "Error while re-creating Linksets from persisted file", ex); } } private void registerHttpUserMbean(HttpUser httpUser) { try { ObjectName httpUserObjNname = new ObjectName(SmscManagement.JMX_DOMAIN + ":layer=HttpUser,name=" + httpUser.getUserName()); StandardMBean httpUserMxBean = new StandardMBean(httpUser, HttpUserMBean.class, true); if (this.mbeanServer != null) this.mbeanServer.registerMBean(httpUserMxBean, httpUserObjNname); } catch (InstanceAlreadyExistsException e) { logger.error(String.format("Error while registering MBean for HttpUser %s", httpUser.getUserName()), e); } catch (MBeanRegistrationException e) { logger.error(String.format("Error while registering MBean for HttpUser %s", httpUser.getUserName()), e); } catch (NotCompliantMBeanException e) { logger.error(String.format("Error while registering MBean for HttpUser %s", httpUser.getUserName()), e); } catch (MalformedObjectNameException e) { logger.error(String.format("Error while registering MBean for HttpUser %s", httpUser.getUserName()), e); } } private void unregisterHttpUserMbean(String httpUserName) { try { ObjectName httpUserObjNname = new ObjectName(SmscManagement.JMX_DOMAIN + ":layer=HttpUser,name=" + httpUserName); if (this.mbeanServer != null) this.mbeanServer.unregisterMBean(httpUserObjNname); } catch (MBeanRegistrationException e) { logger.error(String.format("Error while unregistering MBean for HttpUser %s", httpUserName), e); } catch (InstanceNotFoundException e) { logger.error(String.format("Error while unregistering MBean for HttpUser %s", httpUserName), e); } catch (MalformedObjectNameException e) { logger.error(String.format("Error while unregistering MBean for HttpUser %s", httpUserName), e); } } }