001 /* 002 * Copyright (C) 2012 eXo Platform SAS. 003 * 004 * This is free software; you can redistribute it and/or modify it 005 * under the terms of the GNU Lesser General Public License as 006 * published by the Free Software Foundation; either version 2.1 of 007 * the License, or (at your option) any later version. 008 * 009 * This software is distributed in the hope that it will be useful, 010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 012 * Lesser General Public License for more details. 013 * 014 * You should have received a copy of the GNU Lesser General Public 015 * License along with this software; if not, write to the Free 016 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 017 * 02110-1301 USA, or see the FSF site: http://www.fsf.org. 018 */ 019 020 package org.crsh.plugin; 021 022 import java.util.HashMap; 023 import java.util.Map; 024 import java.util.logging.Level; 025 import java.util.logging.Logger; 026 027 /** @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> */ 028 class PropertyManager { 029 030 /** . */ 031 private static final Logger log = Logger.getLogger(PropertyManager.class.getName()); 032 033 /** . */ 034 private final Map<String, Property<?>> properties; 035 036 PropertyManager() { 037 this.properties = new HashMap<String, Property<?>>(); 038 } 039 040 /** 041 * Returns a context property or null if it cannot be found. 042 * 043 * @param desc the property descriptor 044 * @param <T> the property parameter type 045 * @return the property value 046 * @throws NullPointerException if the descriptor argument is null 047 */ 048 public <T> T getProperty(PropertyDescriptor<T> desc) throws NullPointerException { 049 if (desc == null) { 050 throw new NullPointerException(); 051 } 052 return getProperty(desc.getName(), desc.getType()); 053 } 054 055 /** 056 * Returns a context property or null if it cannot be found. 057 * 058 * @param propertyName the name of the property 059 * @param type the property type 060 * @param <T> the property parameter type 061 * @return the property value 062 * @throws NullPointerException if the descriptor argument is null 063 */ 064 <T> T getProperty(String propertyName, Class<T> type) throws NullPointerException { 065 if (propertyName == null) { 066 throw new NullPointerException("No null property name accepted"); 067 } 068 if (type == null) { 069 throw new NullPointerException("No null property type accepted"); 070 } 071 Property<?> property = properties.get(propertyName); 072 if (property != null) { 073 PropertyDescriptor<?> descriptor = property.getDescriptor(); 074 if (descriptor.getType().isAssignableFrom(type)) { 075 return type.cast(property.getValue()); 076 } 077 } 078 return null; 079 } 080 081 /** 082 * Set a context property to a new value. If the provided value is null, then the property is removed. 083 * 084 * @param desc the property descriptor 085 * @param value the property value 086 * @param <T> the property parameter type 087 * @throws NullPointerException if the descriptor argument is null 088 */ 089 <T> void setProperty(PropertyDescriptor<T> desc, T value) throws NullPointerException { 090 if (desc == null) { 091 throw new NullPointerException(); 092 } 093 if (value == null) { 094 log.log(Level.FINE, "Removing property " + desc.name); 095 properties.remove(desc.getName()); 096 } else { 097 Property<T> property = new Property<T>(desc, value); 098 log.log(Level.FINE, "Setting property " + desc.name + " to value " + property.getValue()); 099 properties.put(desc.getName(), property); 100 } 101 } 102 103 /** 104 * Set a context property to a new value. If the provided value is null, then the property is removed. 105 * 106 * @param desc the property descriptor 107 * @param value the property value 108 * @param <T> the property parameter type 109 * @throws NullPointerException if the descriptor argument is null 110 * @throws IllegalArgumentException if the string value cannot be converted to the property type 111 */ 112 <T> void setProperty(PropertyDescriptor<T> desc, String value) throws NullPointerException, IllegalArgumentException { 113 if (desc == null) { 114 throw new NullPointerException(); 115 } 116 if (value == null) { 117 log.log(Level.FINE, "Removing property " + desc.name); 118 properties.remove(desc.getName()); 119 } else { 120 Property<T> property = desc.toProperty(value); 121 log.log(Level.FINE, "Setting property " + desc.name + " to value " + property.getValue()); 122 properties.put(desc.getName(), property); 123 } 124 } 125 }