From: <pka...@us...> - 2009-06-30 13:13:11
|
Revision: 280 http://cse-ip.svn.sourceforge.net/cse-ip/?rev=280&view=rev Author: pkasprzak Date: 2009-06-30 11:39:55 +0000 (Tue, 30 Jun 2009) Log Message: ----------- * WebConfig major rewrite - Groups of settings are persisted / supported - Only one single configuration - Cleanups - Interface changes (to better accomodate a ws-interface) - Settings are not deleted from persistence on xml changes - Setting-defaults are also persisted Modified Paths: -------------- trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/configuration.xml trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/de/campussource/cse/webconfig/Configuration.java trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/de/campussource/cse/webconfig/ConfigurationManager.java trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/de/campussource/cse/webconfig/ConfigurationManagerImpl.java trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/de/campussource/cse/webconfig/Setting.java trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/de/campussource/cse/webconfig/SettingCategory.java trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/de/campussource/cse/webconfig/SettingNotFoundException.java trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-war/src/java/de/campussource/cse/webconfig/AuthServletStub.java trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-war/src/java/de/campussource/cse/webconfig/EditConfigurationServlet.java trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-war/web/WEB-INF/web.xml Removed Paths: ------------- trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-war/src/java/de/campussource/cse/webconfig/ConfigurationServlet.java Modified: trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/configuration.xml =================================================================== --- trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/configuration.xml 2009-06-27 16:12:05 UTC (rev 279) +++ trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/configuration.xml 2009-06-30 11:39:55 UTC (rev 280) @@ -1,6 +1,20 @@ <?xml version="1.0" encoding="ISO-8859-1"?> <configuration> + <category name="Core" description="Grundlegende CSE Systemeinstellungen"> + <setting name="core_test_1" description="Test-Setting 1" default="test-value-1"/> + <setting name="core_test_2" description="Test-Setting 2" default="test-value-2"/> + <setting name="core_test_3" description="Test-Setting 3" default="test-value-3"/> + <setting name="core_test_4" description="Test-Setting 4" default="test-value-4"/> + </category> + + <category name="Ilias" description="Ilias-Adapter Einstellungen"> + <setting name="ilias_login_client" description="Ident des Clients" default="test"/> + <setting name="ilias_login_username" description="Username f\xFCr Login" default="root"/> + <setting name="ilias_login_password" description="Passwort f\xFCr Login" default="cs3-1p"/> + <setting name="ilias_ws_url" description="URL der WS-Schnittstelle" default="http://localhost/ilias3/webservice/soap/server.php?debug=1"/> + </category> +<!-- <category public="false" name="csecore" description="Grundlegende CSE Systemeinstellungen"> <setting name="CSE_Health_Komponente_Aktiv" description="Nutzung der Health Komponente (automatische Behebung von Inkonsistenzen)" default="true" type="1"/> <setting name="admin_email" description="E-Mail-Adresse f\xFCr Fehlerbenachrichtigungen" default="user@domain.xx" type="4"/> @@ -16,7 +30,7 @@ <setting name="mapper_autoswapsystems" description="Immer das gr\xF6\xDFere System als Quellsystem benutzen" default="false" type="1"/> </category> - <!-- category public="true" name="ilias" description="Ilias-Client Einstellungen"> + <category public="true" name="ilias" description="Ilias-Client Einstellungen"> <setting name="ilias_Name_der_Installation" description="Name der Installation" default="IliasClient"/> <setting name="ilias_Name_der_globalen_Dozentenrolle" description="Name der globalen Dozentenrolle" default="Administrator"/> <setting name="ilias_id_der_dozentenrolle" description="ID der globalen Dozentenrolle" default="149" type="0"/> @@ -27,7 +41,7 @@ <setting name="ilias_SOAP_Admin_Passwort" description="SOAP Passwort" default="" type="3"/> <setting name="ilias_SOAP_Service_Name" description="SOAP Servicename" default="ILIASSoapWebservice"/> <setting name="ilias_SOAP_Service_Namespace" description="SOAP Namespace" default="urn:ilUserAdministration"/> - </category --> + </category <category public="true" name="ldap" description="LDAP Einstellungen"> <setting name="clix_ldap_providerurl" description="Provider URL" default="ldaps://phoebe.clix.uni-saarland.de"/> @@ -49,7 +63,6 @@ <setting name="clix_internalcoursetypeidentifier" description="CLIX-ID der Veranstaltungsvorlage" default="104313" type="0"/> <setting name="clix_defaulttextforcategory" description="Beschreibung f\xFCr angelegte Kategorien. $0 wird durch den Namen der Kategorie ersetzt." default="Sie befinden sich im Kurskatalog $0, in dem das komplette Vorlesungsverzeichnis des aktuellen Semesters abgebildet ist." type="7"/> <setting name="clix_languageidentifier" description="Sprache f\xFCr Veranstaltungen (nach ISO 639)" default="de"/> - <!-- setting name="clix_regtypedurationmonth" description="Anzeigezeitraum einer Veranstaltung im CLIX-Katalog (Monate)" default="6" type="0"/ --> <setting name="clix_lecture_start_date" description="Startdatum f\xFCr Veranstaltungen" default="2008-04-01" type="8"/> <setting name="clix_lecture_end_date" description="Enddatum f\xFCr Veranstaltungen" default="2008-09-30" type="8"/> <setting name="clix_lecturedirdepth" description="Tiefe des Veranstaltungsverzeichnisses" default="4" type="0"/> @@ -87,5 +100,6 @@ <setting name="lsf_SOAP_writeservice_url" description="SOAP Input Service URL" default="http://itmlsf01.univw.uni-saarland.de/qisserver/services/CSEService" type="6"/> <setting name="lsf_SOAP_writeservice_username" description="SOAP Benutzername" default="admin"/> <setting name="lsf_SOAP_writeservice_password" description="SOAP Passwort" default="password" type="3"/> - </category> + </category> + --> </configuration> \ No newline at end of file Modified: trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/de/campussource/cse/webconfig/Configuration.java =================================================================== --- trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/de/campussource/cse/webconfig/Configuration.java 2009-06-27 16:12:05 UTC (rev 279) +++ trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/de/campussource/cse/webconfig/Configuration.java 2009-06-30 11:39:55 UTC (rev 280) @@ -5,17 +5,6 @@ import java.util.Collection; import java.util.List; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToMany; -import javax.persistence.Transient; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @@ -27,186 +16,20 @@ * categories, otherwise in a long list */ -@NamedQueries({ - @NamedQuery( name = "Configuration.getAll", - query = "SELECT m FROM Configuration m"), - @NamedQuery( name = "Configuration.getById", - query = "SELECT m FROM Configuration m WHERE m.configurationId = :configurationId"), - @NamedQuery( name = "Configuration.getByName", - query = "SELECT m FROM Configuration m WHERE m.configurationName = :configurationName"), - @NamedQuery( name = "Configuration.getActive", - query = "SELECT m FROM Configuration m WHERE m.active = true") - -}) - -@Entity @XmlRootElement(name="configuration") -public class Configuration implements Serializable{ +public class Configuration implements Serializable { - /* CONSTANTS */ /** The Constant serialVersionUID. */ private static final long serialVersionUID = -3173737964939496322L; - /** name of the default config that will be created if no config is found. */ - @Transient - public final static String DEFAULT_CONFIG_NAME="default"; - - /* PERSISTANT FIELDS */ - - - /** The configuration id. */ - /* standard getters /setters */ - /** - * Gets the configuration id. - * - * @return the id of this config - */ - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private int configurationId; - - /** if this configuration is the currently active config. */ - private boolean active; - - /** its name. */ - private String configurationName; - - /** - * list of all settings, note this is NOT an xml attribute right here, you - * can find it in the SettingCategory. - */ - /** - * Gets the settings. - * - * @return a list of all settings from this configuration - */ - @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) - @JoinColumn(name = "configurationId") - private Collection<Setting> settings=new ArrayList<Setting>(); - - - /* END OF PERSISTANT FIELDS, START OF XML FIELDS */ - /** The categories. */ - /** - * Gets the categories. - * - * @return the categories for this configuration - * - * @throws IllegalStateException - * if categories is null, ie we created this entity from - * persistence rather then from xml - */ - @Transient @XmlElement(name="category") - private List<SettingCategory> categories; //list of all categories - /* END OF XML FIELDS */ + private List<SettingCategory> categories; - - /** - * Instantiates a new configuration. - */ - public Configuration(){ - + public Configuration() { } - - /** - * The Constructor. - * - * @param name - * name of the new configuration - */ - public Configuration(String name){ - this.configurationName=name; - } - - /* standard getters /setters */ - - /** - * Gets the configuration id. - * - * @return the id of this config - */ - public int getConfigurationId() { - return configurationId; - } /** - * set a new configguration id. you usually dont want to do this - * - * @param settingSetId - * the setting set id - */ - public void setConfigurationId(int settingSetId) { - this.configurationId = settingSetId; - } - - /** - * Checks if is active. - * - * @return true when this config is currently flagged active - */ - public boolean isActive() { - return active; - } - - /** - * WARNING this will NOT mark the old active settings as inactive or install - * a new active setting when turning a setting off!. - * - * @param active - * if this settings shall be active or not - */ - public void setActive(boolean active) { - this.active = active; - } - - /** - * Gets the configuration name. - * - * @return the name which the user has choosen for this config - */ - public String getConfigurationName() { - return configurationName; - } - - /** - * Sets the configuration name. - * - * @param settingName - * set a new name for this config - */ - public void setConfigurationName(String settingName) { - this.configurationName = settingName; - } - - - /** - * Gets the settings. - * - * @return a list of all settings from this configuration - */ - - public Collection<Setting> getSettings() { - return settings; - - } - - /** - * sets completly new settings for this configuration WARNING: this will NOT - * delete old settings from the database, so make sure you realy want to do - * this. - * - * @param settings - * the new settings - */ - public void setSettings(Collection<Setting> settings) { - this.settings=settings; - } - - - - /** * Gets the categories. * * @return the categories for this configuration @@ -216,8 +39,8 @@ * persistence rather then from xml */ public List<SettingCategory> getCategories() throws IllegalStateException { - if(categories==null){ - throw new IllegalStateException("categories is null, we most likely created this entity from persistence rather then from XML"); + if(categories == null) { + throw new IllegalStateException("No categories found!"); } return categories; } @@ -226,29 +49,10 @@ * @see java.lang.Object#toString() */ public String toString(){ - String ret="Config id:"+configurationId+", name:"+configurationName+";Settings (only persistant, not withing categorys)\n"; - for(Setting s:settings){ - ret+=s+"\n"; + String string = "Configuration:\n"; + for (SettingCategory category : categories) { + string += category + "\n"; } - return ret; + return string; } - - /** - * Gets the setting by name. - * - * @param settingname - * the setting to look for - * - * @return the found setting object - * - * @throws SettingNotFoundException - * if this setting isnt found in this configuration - */ - public Setting getSettingByName(String settingname) throws SettingNotFoundException{ - for(Setting s:settings){ - if(s.getName().equalsIgnoreCase(settingname)) - return s; - } - throw new SettingNotFoundException(settingname,this); - } } \ No newline at end of file Modified: trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/de/campussource/cse/webconfig/ConfigurationManager.java =================================================================== --- trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/de/campussource/cse/webconfig/ConfigurationManager.java 2009-06-27 16:12:05 UTC (rev 279) +++ trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/de/campussource/cse/webconfig/ConfigurationManager.java 2009-06-30 11:39:55 UTC (rev 280) @@ -14,105 +14,21 @@ */ @Local public interface ConfigurationManager { - /** the location of the main configuration declaration xml-file. */ - public static final String CONFIG_XML_LOCATION="/configuration.xml"; - /** - * sets a new active configuration and sets the last active configuration to - * not-active unless the new config cannot be found setting cache must be - * invalidated after doing this!. - * - * @param newActiveConfig - * the new active config - */ - public void setActiveConfiguration(Configuration newActiveConfig); + public Setting getSetting(String settingName, String categoryName) throws SettingNotFoundException; - /** - * tries to locate the active configuration. if none is found, it creates a - * new one, marks it as active and returns it - * - * @return the active configuration or null if the config cannot be found - * AND cannot be created for some reason (most syntax likely error - * in CONFIG_XML_LOCATION) - */ - public Configuration getActiveConfiguration(); + public String getSettingAsString(String settingName, String categoryName) throws SettingNotFoundException; + public int getSettingAsInteger(String settingName, String categoryName) throws SettingNotFoundException; - /** - * Gets the all configurations. - * - * @return a list of all configurations in this system - */ - public List<Configuration> getAllConfigurations(); + public boolean getSettingAsBoolean(String settingName, String categoryName) throws SettingNotFoundException; - /** - * Gets the config by id. - * - * @param id - * the id to look for - * - * @return the requested Configuration or null if it cannot be found - */ - public Configuration getConfigById(int id); + public List<Setting> getSettings(); - /** - * gets a specific configuration from database don't confuse this with - * getSetting()!. - * - * @param name - * the name to look for, case sensitive - * - * @return the requested Configuration or null if it cannot be found - */ - public Configuration getConfigByName(String name); + public List<SettingCategory> getCategories(); + public void deleteSetting(Setting setting); + public void updateSetting(Setting setting); - /** - * updates the the config note that you cannot delete settings by simply - * passing a new list of settings to the configuration via setSettings() and - * then call updateConfiguration. this will NOT delete the old entrys - * - * @param tosave - * the config object to be saved - */ - public void updateConfiguration(Configuration tosave); - - /** - * helper to quickly get a setting this should also save the requested - * setting into some sort of cache to make further requests faster. - * - * @param settingname - * name of the setting - * - * @return null the setting, or: if the active configuration doesn't contain - * this setting or getActiveConfiguration returned null - * - * @throws SettingNotFoundException - * if the setting with this name cannot be found or no active - * config could not be loaded - */ - public Setting getSetting(String settingname) throws SettingNotFoundException; - - - - /** - * deletes a config from persistence. - * - * @param config - * the config to be deleted - */ - public void deleteConfig(Configuration config); - - - /** - * deletes a single setting from a Configuration. - * - * @param settingToBeDeleted - * the setting to be deleted - * @param config - * the config to which this setting belongs - */ - public void deleteSingleSetting(Setting settingToBeDeleted,Configuration config); - } Modified: trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/de/campussource/cse/webconfig/ConfigurationManagerImpl.java =================================================================== --- trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/de/campussource/cse/webconfig/ConfigurationManagerImpl.java 2009-06-27 16:12:05 UTC (rev 279) +++ trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/de/campussource/cse/webconfig/ConfigurationManagerImpl.java 2009-06-30 11:39:55 UTC (rev 280) @@ -7,16 +7,21 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; import java.util.List; - +import java.util.logging.*; +import java.util.Map; +import javax.annotation.PostConstruct; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; -import org.apache.log4j.Logger; +//import org.apache.log4j.Logger; /** * @@ -25,248 +30,191 @@ @Stateless(mappedName="cse/ConfigurationManager") public class ConfigurationManagerImpl implements ConfigurationManager, ConfigurationManagerRemote { - /** The em. */ + /** The location of the main configuration declaration xml-file. */ + public static final String CONFIG_XML_LOCATION = "/configuration.xml"; + @PersistenceContext - protected EntityManager em; + protected EntityManager entityManager; /** The logger. */ protected Logger logger; /** - * holds all settings, that have been requested via getSetting() must be - * cleared if: a new active config has been set or settings have been - * changed. + * Use a synchronized map as settings-cache. + * + * Not really conforming to ejb3.0 spec, but as along as there are no singletons, we + * have to do some workarounds. + * */ - private HashMap<String,Setting> cache=new HashMap<String, Setting>(); + private static Map<String, Setting> cache = Collections.synchronizedMap(new HashMap<String, Setting>()); + /* Only used for synchronization (must be final, because we synchronize on it) */ + private final static Boolean cacheMutex = true; + private static boolean isCacheInitialized = false; - /* (non-Javadoc) - * @see edu.cse.persistence.session.ConfigurationManager#getActiveConfiguration() - */ -// @SuppressWarnings("unchecked") - public Configuration getActiveConfiguration() { - List<Configuration> results=(List<Configuration>) em.createNamedQuery("Configuration.getActive").getResultList(); - checkConfiguration(); + /* Initialize cache && load data from xml-config */ + protected void init() { + synchronized (cacheMutex) { + if (!isCacheInitialized) { + /* Must be first, to prevent recursion init() -> checkConfiguration() -> getCategories() -> init() */ + isCacheInitialized = true; + checkConfiguration(); + loadCache(); + } + } + } - //see if we have a result to return, otherwise create a new one - if(results.size()>0) - return results.get(0); + protected void loadCache() { + cache.clear(); + for (Setting setting : getSettings()) { + cache.put(setting.getName(), setting); + } + } + /* Generate key for cache */ + protected String generateCacheKey(String categoryName, String settingName) { + return "/" + categoryName + "/" + settingName; + } - //no active config found, create it + public List<Setting> getSettings() { + init(); + List<Setting> settings = (List<Setting>) entityManager.createNamedQuery("Setting.getAll").getResultList(); + return settings; + } - //try to unmarshal configuration from XML - Configuration configFromXml=null; - try{ - Unmarshaller um= JAXBContext.newInstance("de.campussource.cse.webconfig").createUnmarshaller(); - configFromXml=(Configuration)um.unmarshal(getClass().getResourceAsStream(ConfigurationManager.CONFIG_XML_LOCATION)); - } - catch(Exception e){ - e.printStackTrace(); - return null; - } + public List<SettingCategory> getCategories() { + init(); + List<SettingCategory> categories = (List<SettingCategory>) entityManager.createNamedQuery("SettingCategory.getAll").getResultList(); + return categories; + } - Collection<Setting> newsettings=new ArrayList<Setting>(); - - //traverse xml to set all settings to default and move them out of their categories directly to the configuration - for(SettingCategory cat:configFromXml.getCategories()){ - for(Setting setting:cat.getSettings()){ - setting.setToDefault(); - newsettings.add(setting); - } - } - configFromXml.setSettings(newsettings); - configFromXml.setActive(true); - configFromXml.setConfigurationName(Configuration.DEFAULT_CONFIG_NAME); - updateConfiguration(configFromXml); - return configFromXml; - } - /* (non-Javadoc) - * @see edu.cse.persistence.session.ConfigurationManager#getAllConfigurations() + * @see edu.cse.persistence.session.ConfigurationManager#getSetting(java.lang.String) */ - //@SuppressWarnings("unchecked") - public List<Configuration> getAllConfigurations() { + public Setting getSetting(String settingName, String categoryName) throws SettingNotFoundException { - return (List<Configuration>) em.createNamedQuery("Configuration.getAll").getResultList(); + if (settingName == null || categoryName == null) { + throw new SettingNotFoundException("", "SettingName and / or categoryName are null!"); + } - } + init(); - /* (non-Javadoc) - * @see edu.cse.persistence.session.ConfigurationManager#getConfigById(int) - */ -// @SuppressWarnings("unchecked") - public Configuration getConfigById(int id) { + /* Check for cache hit */ + String cacheKey = generateCacheKey(categoryName, settingName); + if (cache.containsKey(cacheKey)) { + return cache.get(cacheKey); + } - List<Configuration> results=(List<Configuration>) em.createNamedQuery("Configuration.getById").setParameter("configurationId" , id).getResultList(); - checkConfiguration(); + /* Do it the hard way */ + Setting setting = (Setting) entityManager.createNamedQuery("Setting.getByNames") .setParameter("settingName", settingName) + .setParameter("categoryName", categoryName) + .getSingleResult(); - //see if we have a result to return, otherwise return null - if(results.size()>0) - return results.get(0); - else - return null; - } + if (setting == null) { + throw new SettingNotFoundException(settingName); + } - /* (non-Javadoc) - * @see edu.cse.persistence.session.ConfigurationManager#getConfigByName(java.lang.String) - */ -// @SuppressWarnings("unchecked") - public Configuration getConfigByName(String name) { - List<Configuration> results=(List<Configuration>) em.createNamedQuery("Configuration.getByName").setParameter("configurationName" , name).getResultList(); - - //see if we have a result to return, otherwise return null - if(results.size()>0) - return results.get(0); - else - return null; + cache.put(cacheKey, setting); + return setting; } - /* (non-Javadoc) - * @see edu.cse.persistence.session.ConfigurationManager#getSetting(java.lang.String) - */ - public Setting getSetting(String settingname) throws SettingNotFoundException { - if(settingname==null){ - throw new SettingNotFoundException(settingname,null); - } + public String getSettingAsString(String settingName, String categoryName) throws SettingNotFoundException { + Setting setting = getSetting(settingName, categoryName); + return setting.getAsString(); + } - //check the cache if it contains the requested setting - if(cache.containsKey(settingname)){ - return cache.get(settingname); - } + public int getSettingAsInteger(String settingName, String categoryName) throws SettingNotFoundException { + Setting setting = getSetting(settingName, categoryName); + return setting.getAsInteger(); + } - //get active config. this will also create a new default config if no config was found - Configuration active=getActiveConfiguration(); + public boolean getSettingAsBoolean(String settingName, String categoryName) throws SettingNotFoundException { + Setting setting = getSetting(settingName, categoryName); + return setting.getAsBoolean(); + } - //see if we have no active config in our system. this should only happen when configuration.xml is malformed - if(active==null){ - throw new SettingNotFoundException("Could not create default Config, check "+ConfigurationManager.CONFIG_XML_LOCATION,null); - } - - //get the setting, will throw SettingNotFoundException if the setting doesnt exist - Setting found=active.getSettingByName(settingname); - - //Save to cache and return - cache.put(settingname, found); - return found; - } - - - /* (non-Javadoc) - * @see edu.cse.persistence.session.ConfigurationManager#updateConfiguration(edu.cse.persistence.entity.Configuration) - */ - public void updateConfiguration(Configuration tosave) { - logger = Logger.getLogger(ConfigurationManagerImpl.class); - logger.debug("Updating " +tosave); - em.merge(tosave); - logger.debug("done " +tosave); - cache.clear(); -// em.persist(tosave); - } - /* (non-Javadoc) - * @see edu.cse.persistence.session.ConfigurationManager#setActiveConfiguration(edu.cse.persistence.entity.Configuration) - */ - public void setActiveConfiguration(Configuration newActiveConfig) { - //traverse all configs to only allow one active config at the time - for(Configuration current:getAllConfigurations()){ - //set the active state of this config to true if it is our new config, otherwise false - current.setActive(current.getConfigurationId()==newActiveConfig.getConfigurationId()); - updateConfiguration(current); - } - cache.clear(); - } - - /* (non-Javadoc) - * @see edu.cse.persistence.session.ConfigurationManager#deleteConfig(edu.cse.persistence.entity.Configuration) - */ - public void deleteConfig(Configuration config) { - config= em.merge(config); - em.remove(config); - cache.clear(); - } - - /* (non-Javadoc) * @see edu.cse.persistence.session.ConfigurationManager#deleteSingleSetting(edu.cse.persistence.entity.Setting) */ - public void deleteSingleSetting(Setting setting,Configuration config) { - config.getSettings().remove(setting); - config=em.merge(config); - setting=em.merge(setting); - em.remove(setting); - cache.remove(setting.getName()); + public void deleteSetting(Setting setting) { + setting = entityManager.merge(setting); + entityManager.remove(setting); + String key = generateCacheKey(setting.getCategory().getName(), setting.getName()); + if (cache.containsKey(key)) { + cache.remove(key); + } } + public void updateSetting(Setting setting) { + entityManager.merge(setting); + cache.put(generateCacheKey(setting.getCategory().getName(), setting.getName()), setting); + } - /* - * checks if the structure of the stored configs is equivalent to the configuration.xml and updates it if necessary - */ /** - * Check configuration. + * Checks if the structure of the stored configs is equivalent to the configuration.xml and updates it if necessary */ - private void checkConfiguration() - { - logger = Logger.getLogger(ConfigurationManager.class); - Configuration configFromXml=null; - try{ - Unmarshaller um= JAXBContext.newInstance("de.campussource.cse.webconfig").createUnmarshaller(); - configFromXml=(Configuration)um.unmarshal(getClass().getResourceAsStream(ConfigurationManager.CONFIG_XML_LOCATION)); - } - catch(Exception e){ - e.printStackTrace(); - logger.error("Fehler beim Parsen der "+ConfigurationManager.CONFIG_XML_LOCATION+": "+e); - } - Collection<Setting> settingsFromXml=new ArrayList<Setting>(); + private void checkConfiguration() { + logger = Logger.getLogger("de.campussource.cse.webconfig.ConfigurationManager"); + Configuration configFromXml = null; + HashMap<String, List<Setting>> settingsFromXml = new HashMap<String, List<Setting>>(); - //traverse xml and get all the http request parameters for the settings in xml - for(SettingCategory cat:configFromXml.getCategories()){ - for(Setting setting:cat.getSettings()){ - setting.setToDefault(); - settingsFromXml.add(setting); - } - } - boolean update = false; - // settingsFromXml now holds all settings which are defined in configuration.xml, and they are initialied with their default value - //now check the structure of all configurations in the system - for(Configuration currentConfig:getAllConfigurations()){ - //check, if there are new settings defined in xml - for(Setting check:settingsFromXml){ - try{ - currentConfig.getSettingByName(check.getName()); - } - catch(SettingNotFoundException e){ - //so the setting wasnt found, create it - currentConfig.getSettings().add(check); - logger.info("Erweitere <b>"+currentConfig.getConfigurationName()+"</b> um <b>" +check.getName()+"</b><br/>"); - update =true; - } - } - Collection<Setting> settingsToBeDeleted=new ArrayList<Setting>(); - //check, if there are settings stored definied that are missing in the xml - for(Setting check:currentConfig.getSettings()){ - boolean found=false; - for(Setting checkpartner:settingsFromXml){ - if(checkpartner.getName().equals(check.getName())){ - found=true; - break; - } - } - if(!found){ - //so the setting wasnt found, delete it from persistance - //we cant delete right here because we are still cycling thru the list. it would give us a concurrentmodificationexception - //to we add it to a list and remove it later - settingsToBeDeleted.add(check); + try { + Unmarshaller um = JAXBContext.newInstance("de.campussource.cse.webconfig").createUnmarshaller(); + configFromXml = (Configuration) um.unmarshal(getClass().getResourceAsStream(CONFIG_XML_LOCATION)); + } catch (Exception e) { + e.printStackTrace(); + logger.severe("Settings could not be parsed (file: " + CONFIG_XML_LOCATION + "): " + e); + } - } - } - for(Setting check:settingsToBeDeleted){ - deleteSingleSetting(check,currentConfig); - logger.info("Entferne <b>"+check.getName()+"</b> von <b>" +currentConfig.getConfigurationName()+"</b><br/>"); - update =true; - } - if (update) - updateConfiguration(currentConfig); + /* Build name -> category resolver for xml categories */ + HashMap<String, SettingCategory> xmlCategoryResolver = new HashMap<String, SettingCategory>(); - } - } - -} + /* Keep all settings from Xml for later (to generate diff xml <-> persistence) */ + for (SettingCategory category : configFromXml.getCategories()) { + xmlCategoryResolver.put(category.getName(), category); + for (Setting setting : category.getSettings()) { + setting.setToDefault(); + if (!settingsFromXml.containsKey(category.getName())) { + settingsFromXml.put(category.getName(), new LinkedList<Setting>()); + } + settingsFromXml.get(category.getName()).add(setting); + } + } + + boolean update = false; + + /* Update structure of configuration in persistence (vs xml-configuration) */ + + /* Build name -> category resolver for persistent categories */ + HashMap<String, SettingCategory> persistentCategoryResolver = new HashMap<String, SettingCategory>(); + HashSet<String> categoryNames = new HashSet<String>(); + for (SettingCategory category : getCategories()) { + persistentCategoryResolver.put(category.getName(), category); + categoryNames.add(category.getName()); + } + + for (String categoryName : settingsFromXml.keySet()) { + + if (!categoryNames.contains(categoryName)) { + /* New category -> create */ + logger.info("Adding new category [" + categoryName + "]"); + SettingCategory category = xmlCategoryResolver.get(categoryName); + /* Clear settings-relations, because we have to rebuild it from the owning side (e.g. the Setting-side) */ + category.getSettings().clear(); + category = entityManager.merge(category); + persistentCategoryResolver.put(categoryName, category); + categoryNames.add(categoryName); + } + + for (Setting setting : settingsFromXml.get(categoryName)) { + SettingCategory category = persistentCategoryResolver.get(categoryName); + if (category.getSettingByName(setting.getName()) == null) { + /* New Setting */ + logger.info("Adding new setting [" + setting.getName() + "] to category [" + categoryName + ", id: " + category.getId() + "]"); + setting.setCategory(category); + entityManager.persist(setting); + update = true; + } + } + } + } +} \ No newline at end of file Modified: trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/de/campussource/cse/webconfig/Setting.java =================================================================== --- trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/de/campussource/cse/webconfig/Setting.java 2009-06-27 16:12:05 UTC (rev 279) +++ trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/de/campussource/cse/webconfig/Setting.java 2009-06-30 11:39:55 UTC (rev 280) @@ -1,50 +1,25 @@ -/* - * - * Campus Source Engine (CSE) is a Middleware framwork designed for educational Institutions. Its aim is to provide an easy solution for setting up IT infrastructures. - * Copyright (C) 2006-2007 Campus Source Initiative NRW - * - * Campus Source Engine is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Contact Information: - * - * cse...@ca... - * - * CampusSource Geschaeftsstelle - * at the FernUniversitaet in Hagen - * Universitaetsstrasse 11 - * D-58097 Hagen - * Germany - * - */ - - - package de.campussource.cse.webconfig; import java.io.Serializable; import java.net.URL; import java.net.MalformedURLException; +import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; import javax.persistence.Transient; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; // TODO: Auto-generated Javadoc /** @@ -52,11 +27,19 @@ * * @author johannesd represents a concrete setting like "password=1234" */ + +@NamedQueries({ + @NamedQuery( name = "Setting.getAll", + query = "SELECT s FROM Setting s"), + + @NamedQuery( name = "Setting.getByNames", + query = "SELECT s FROM Setting s WHERE s.category.name = :categoryName AND s.name = :settingName") +}) + @Entity @XmlRootElement(name="setting") public class Setting implements Serializable{ - /* CONSTANTS */ /** The Constant serialVersionUID. */ @Transient private static final long serialVersionUID = 8044991853608326088L; @@ -76,28 +59,20 @@ * when creating a list of values, value will hold the elements of the list * seperated with this char. */ - public static final String SPLITCHAR = "³"; - - + public static final String SPLITCHAR = "|"; - - - /* START of XML-only fields */ /** the default value for this setting. */ - @Transient - @XmlAttribute(required=true, name="default") +// @Transient + @XmlAttribute(required = true, name = "default") private String defaultValue; - /** Description for this setting, eg "Password for Webservice". */ - @Transient - @XmlAttribute(required=true, name="description") + /** Description for this setting */ + @XmlAttribute(required = true) private String description; /** the type of this settings value, see constants TYPE_XXX. */ - @XmlAttribute(required=false, name="type") - private short type=TYPE_STRING; - - /* END of XML-only fields, start of persistent-only fields */ + @XmlAttribute(required = false) + private short type = TYPE_STRING; /** The id. */ @Id @@ -108,30 +83,24 @@ @Column(columnDefinition="text") private String value; + @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) + @JoinColumn(name = "categoryId") + @XmlTransient + private SettingCategory category; - - /* END of persistent-only fields, start of shared fields */ - - /** * name of this setting, eg "ilias3_password" WARNING: the name has to be * unique for the complete configuration, not only within its category. */ @XmlAttribute(required=true, name="name") private String name; - - /* END of shared fields */ - - - - /* standard getters */ - + /** * Gets the name. * * @return the unique name of this setting */ - public String getName(){ + public String getName() { return name; } @@ -140,7 +109,7 @@ * * @return a human readable description */ - public String getDescription(){ + public String getDescription() { return description; } @@ -149,7 +118,7 @@ * * @return the id */ - public int getId(){ + public int getId() { return id; } @@ -158,7 +127,7 @@ * * @return the type of this setting, see TYPE_XXX constants in this class */ - public short getType(){ + public short getType() { return type; } @@ -168,45 +137,45 @@ * * @return the value of this setting as String */ - public String getValueS(){ + public String getAsString() { return value; } /** - * Gets the value and will replace all placeholdes with the given parameters ($0 with the first element + * Gets the value and will replace all placeholdes with the given parameters ($0 with the first element, etc.) + * * @param params list of parameters that will be translated into the value * @return the value of this setting as String */ - public String getValueS(String[] params){ - String ret=value; - if(params!=null){ - for(int n=0;n<params.length;n++){ - String token="\\$"+n; - ret=ret.replaceAll(token, params[n]); + public String getAsString(String[] params) { + String ret = value; + if (params != null) { + for (int n = 0; n < params.length; n++) { + String token = "\\$" + n; + ret = ret.replaceAll(token, params[n]); } } return ret; } - /** - * a list of strings(the original value splitted by SPLITCHAR) the entrys + * A list of strings(the original value splitted by SPLITCHAR) the entrys * are trim()-ed, so you can put something like "dummy1, dummy2" for value * and will recieve a array ["dummy1"]["dummy2"]. * * @return the list */ - public String[] getListOfValuesS(){ + public String[] getAsListOfStrings(){ - String[] ret=value.split(SPLITCHAR); - for(int x=0;x<ret.length;x++){ - ret[x]=ret[x].trim(); + String[] ret = value.split(SPLITCHAR); + for (int x = 0; x < ret.length; x++) { + ret[x] = ret[x].trim(); } return ret; } /** - * returns a list of integers (the original value splitted by SPLITCHAR and + * Returns a list of integers (the original value splitted by SPLITCHAR and * cast to int). * * @return the list @@ -215,27 +184,24 @@ * if one of the entrys could not be cast to int or the type * isnt TYPE_INT_LIST */ - public int[] getListOfValuesI() throws IllegalArgumentException{ - if(type!=TYPE_INT_LIST) - throw new IllegalArgumentException("cannot get Integer type value for setting: "+name); - String[] tmp = getListOfValuesS(); //"1","2","3"... - int[] ret=new int[tmp.length]; - for(int x=0;x<ret.length;x++){ - try{ - ret[x]=new Integer(tmp[x]).intValue(); - } - catch(NumberFormatException e){ - throw new IllegalArgumentException("cannot parse to Integer value for setting: "+name+" value: "+value); - } + public int[] getAsListOfIntegers() throws IllegalArgumentException { + if ( type != TYPE_INT_LIST) { + throw new IllegalArgumentException("Setting-type incompatible with list of integers for setting: " + name); + } + String[] tmp = getAsListOfStrings(); //"1","2","3"... + int[] ret = new int[tmp.length]; + for (int x = 0; x < ret.length; x++) { + try { + ret[x] = new Integer(tmp[x]).intValue(); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Cannot parse string as integer: " + name + ", value: " + value); + } } return ret; } - - - /** - * Gets the value i. + * Gets the value as integer. * * @return integer value * @@ -243,19 +209,19 @@ * when this setting isnt of type Int or the stored value cannot * be cast to int */ - public int getValueI() throws IllegalArgumentException{ - if(type!=TYPE_INT) - throw new IllegalArgumentException("cannot get Integer type value for setting: "+name); - try{ - return new Integer(value).intValue(); - } - catch(NumberFormatException e){ - throw new IllegalArgumentException("cannot parse to Integer value for setting: "+name+" value: "+value); - } + public int getAsInteger() throws IllegalArgumentException { + if (type != TYPE_INT) { + throw new IllegalArgumentException("Setting-type incompatible with integer: " + name); + } + try { + return new Integer(value).intValue(); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Cannot parse string as integer: " + name + ", value: " + value); + } } /** - * Gets the value b. + * Gets the value as boolean. * * @return boolean value * @@ -263,165 +229,165 @@ * when this setting isnt of type Bool or the stored value * cannot be interpreted as bool */ - public boolean getValueB() throws IllegalArgumentException{ - if(type!=TYPE_BOOL) - throw new IllegalArgumentException("cannot get Boolean type value for setting: "+name); - if(value.equals(BOOLEAN_TRUE)){ - return true; - } - if(value.equals(BOOLEAN_FALSE)){ - return false; - } - //if we get here, the value was strange and defintly not boolean - throw new IllegalArgumentException("cannot get Boolean type value for setting: "+name); - } + public boolean getAsBoolean() throws IllegalArgumentException { + if (type != TYPE_BOOL) { + throw new IllegalArgumentException("Setting-type incompatible with boolean: " + name); + } + if (value.equals(BOOLEAN_TRUE)) { + return true; + } + if (value.equals(BOOLEAN_FALSE)) { + return false; + } + /* If we get here, the value was strange and defintly not boolean */ + throw new IllegalArgumentException("Cannot parse string as boolean: " + name + ", value: " + value); + } - /** - * Gets the value u. + * Gets the value as URL. * * @return url value * * @throws IllegalArgumentException * when this setting is not of type URL */ - public URL getValueU() throws IllegalArgumentException{ - if(type!=TYPE_URL) - throw new IllegalArgumentException("cannot get URL type value for setting: "+name); - String urlString = value.trim(); - try { - return new URL(urlString); - } - catch (MalformedURLException e) { - throw new IllegalArgumentException("cannot get URL type value for setting: "+name); - } - } + public URL getAsUrl() throws IllegalArgumentException { + if (type != TYPE_URL) { + throw new IllegalArgumentException("Setting-type incompatible with url: " + name); + } + String urlString = value.trim(); + try { + return new URL(urlString); + } catch (MalformedURLException e) { + throw new IllegalArgumentException("Cannot parse string as url: " + name + ", value: " + value); + } + } /** - * for date-settings, this will get the day of the month + * For date-settings, this will get the day of the month * * @return day value * * @throws IllegalArgumentException * when this setting is not of type URL */ - public int getValueDateDay() throws IllegalArgumentException{ - if(type!=TYPE_DATE) - throw new IllegalArgumentException("cannot get URL type value for setting: "+name); - String[] parts= value.trim().split("-"); - try { - return new Integer(parts[2]).intValue(); - } - catch (Exception e) { - throw new IllegalArgumentException("cannot get Day value for setting: "+name); - } - } + public int getAsDateDay() throws IllegalArgumentException { + if (type != TYPE_DATE) { + throw new IllegalArgumentException("Setting-type incompatible with date-day: " + name); + } + String[] parts = value.trim().split("-"); + try { + return new Integer(parts[2]).intValue(); + } catch (Exception e) { + throw new IllegalArgumentException("Cannot parse string as date-day: " + name + ", value: " + value); + } + } + /** - * for date-settings, this will get the month-of-year + * For date-settings, this will get the month-of-year * * @return day value * * @throws IllegalArgumentException * when this setting is not of type URL */ - public int getValueDateMonth() throws IllegalArgumentException{ - if(type!=TYPE_DATE) - throw new IllegalArgumentException("cannot get URL type value for setting: "+name); - String[] parts= value.trim().split("-"); - try { - return new Integer(parts[1]).intValue(); - } - catch (Exception e) { - throw new IllegalArgumentException("cannot get Month value for setting: "+name); - } - } + public int getAsDateMonth() throws IllegalArgumentException { + if (type != TYPE_DATE) { + throw new IllegalArgumentException("Setting-type incompatible with date-month: " + name); + } + String[] parts = value.trim().split("-"); + try { + return new Integer(parts[1]).intValue(); + } catch (Exception e) { + throw new IllegalArgumentException("Cannot parse string as date-month: " + name + ", value: " + value); + } + } /** - * for date-settings, this will get the month-of-year + * For date-settings, this will get the month-of-year * * @return day value * * @throws IllegalArgumentException * when this setting is not of type URL */ - public int getValueDateYear() throws IllegalArgumentException{ - if(type!=TYPE_DATE) - throw new IllegalArgumentException("cannot get URL type value for setting: "+name); - try { - return new Integer(value.substring(0,4)); - } - catch (Exception e) { - throw new IllegalArgumentException("cannot get Year value for setting: "+name); - } - } - - - + public int geAsDateYear() throws IllegalArgumentException { + if (type != TYPE_DATE) { + throw new IllegalArgumentException("Setting-type incompatible with date-year: " + name); + } + try { + return new Integer(value.substring(0, 4)); + } catch (Exception e) { + throw new IllegalArgumentException("Cannot parse string as date-year: " + name + ", value: " + value); + } + } + /** - * sets the new value of this setting. + * Sets the new value of this setting. * * @param newval * the new value */ - public void setValue(int newval){ - value=newval+""; - } + public void setValue(int newval) { + value = newval + ""; + } /** - * sets the new value of this setting. + * Sets the new value of this setting. * * @param newval * the new value */ - public void setValue(boolean newval){ - value=newval?BOOLEAN_TRUE:BOOLEAN_FALSE; - } + public void setValue(boolean newval) { + value = newval ? BOOLEAN_TRUE : BOOLEAN_FALSE; + } /** - * sets the new value of this setting. if this setting is of type list, it + * Sets the new value of this setting. If this setting is of type list, it * will replace all newline-chars with SPLITCHAR so you can feed setvalue() * directly with the HTTP-parameters form a textarea-field * * @param newval * the new value */ - public void setValue(String newval){ - if(type==TYPE_INT_LIST || type==TYPE_STRING_LIST){ - value=newval.replaceAll("\n", SPLITCHAR); - //removed empty list entries - String[] listvalues=getListOfValuesS(); - value=""; - for(String currentListEntry:listvalues){ - if(currentListEntry.trim().length()>0){ - value+=currentListEntry.trim()+SPLITCHAR; - } - } - if(value.length()>1){ - value=value.substring(0, value.length()-1); - } - } - else - value=newval; - } + public void setValue(String newval) { + if (type == TYPE_INT_LIST || type == TYPE_STRING_LIST) { + value = newval.replaceAll("\n", SPLITCHAR); + //removed empty list entries + String[] listvalues = getAsListOfStrings(); + value = ""; + for (String currentListEntry : listvalues) { + if (currentListEntry.trim().length() > 0) { + value += currentListEntry.trim() + SPLITCHAR; + } + } + if (value.length() > 1) { + value = value.substring(0, value.length() - 1); + } + } else { + value = newval; + } + } /** - * will set the settings value to its default value. + * Will set the settings value to its default value. * * @throws IllegalStateException * if default value is null, which usually means that we created * this entity from persistence rather then from XML */ - public void setToDefault() throws IllegalStateException{ - if(defaultValue==null){ - throw new IllegalStateException("Default-value is null for setting [" + name + "], we most likely created this entity from persistence rather then from XML."); - } - if(type==TYPE_BOOL){ - value=defaultValue.equalsIgnoreCase(BOOLEAN_TRUE)?BOOLEAN_TRUE:BOOLEAN_FALSE; - } - else{ - value=defaultValue; - } - } + public void setToDefault() throws IllegalStateException { +/* + if (defaultValue == null) { + throw new IllegalStateException("Default-value is null for setting [" + name + "], we most likely created this entity from persistence rather then from XML."); + } +*/ + if (type == TYPE_BOOL) { + value = defaultValue.equalsIgnoreCase(BOOLEAN_TRUE) ? BOOLEAN_TRUE : BOOLEAN_FALSE; + } else { + value = defaultValue; + } + } /** * Gets the default value. @@ -432,12 +398,14 @@ * if default value is null, which usually means that we created * this entity from persistence rather then from XML */ - public String getDefaultValue() throws IllegalStateException { - if(defaultValue==null){ - throw new IllegalStateException("defaultvalue is null, we most likely created this entity from persistence rather then from XML"); - } - return defaultValue; - } + public String getDefaultValue() throws IllegalStateException { +/* + if (defaultValue == null) { + throw new IllegalStateException("defaultvalue is null, we most likely created this entity from persistence rather then from XML"); + } + */ + return defaultValue; + } /** * Sets the the name. @@ -445,16 +413,22 @@ * @param thename * the new the name */ - public void setTheName(String thename) { - this.name=thename; - } + public void setTheName(String thename) { + this.name = thename; + } /* (non-Javadoc) * @see java.lang.Object#toString() */ - public String toString(){ - return getName()+"="+(getType()==TYPE_PASSWORD?"****":getValueS()); - } + public String toString() { + return getName() + "=" + (getType() == TYPE_PASSWORD ? "****" : getAsString()); + } - + public SettingCategory getCategory() { + return category; + } + + public void setCategory(SettingCategory category) { + this.category = category; + } } Modified: trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/de/campussource/cse/webconfig/SettingCategory.java =================================================================== --- trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/de/campussource/cse/webconfig/SettingCategory.java 2009-06-27 16:12:05 UTC (rev 279) +++ trunk/sandbox/lsf-adapter-demo/WebConfig/WebConfig-ejb/src/java/de/campussource/cse/webconfig/SettingCategory.java 2009-06-30 11:39:55 UTC (rev 280) @@ -1,129 +1,99 @@ -/* - * - * Campus Source Engine (CSE) is a Middleware framwork designed for educational Institutions. Its aim is to provide an easy solution for setting up IT infrastructures. - * Copyright (C) 2006-2007 Campus Source Initiative NRW - * - * Campus Source Engine is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Contact Information: - * - * cse...@ca... - * - * CampusSource Geschaeftsstelle - * at the FernUniversitaet in Hagen - * Universitaetsstrasse 11 - * D-58097 Hagen - * Germany - * - */ - - - package de.campussource.cse.webconfig; + import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; -// TODO: Auto-generated Javadoc -/** - * The Class SettingCategory. - * - * @author johannesd represents a system configuration category like "ilias" - * note that this is NOT an ejb3 entity and thus is NOT persistent,its - * just a helper to show the configuration more structured when its - * loaded from XML - */ +@NamedQueries({ + @NamedQuery( name = "SettingCategory.getAll", + query = "SELECT c FROM SettingCategory c") +}) + +@Entity @XmlRootElement(name="category") public class SettingCategory implements Serializable{ /** The Constant serialVersionUID. */ private static final long serialVersionUID = -317373796493949632L; - - /** - * if the settings in this group may be changed by any admin or only core - * admins. - */ - @XmlAttribute(required=true,name="public") - private boolean publicCategory; - + /** The id. */ + @Id + @GeneratedValue(strategy = GenerationType.TABLE) + private int id; + /** its name. */ - @XmlAttribute(required=true, name="name") - private String categoryName; + private String name; /** its description. */ - @XmlAttribute(required=true,name="description") - private String description; + private String description; - - /** list of all settings within this category. */ - @XmlElement(name="setting") - private List<Setting> settings; + /** List of all settings within this category. */ + @OneToMany(mappedBy="category", cascade = CascadeType.ALL, fetch = FetchType.EAGER) + private Collection<Setting> settings = new ArrayList<Setting>(); - - - /** - * Instantiates a new setting category. - */ public SettingCategory() { } + @XmlAttribute(required = true, name = "description") + public Strin... [truncated message content] |