[jboss-cvs] jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/preferences ...

Christian Bauer christian at hibernate.org
Sat Dec 29 21:33:22 EST 2007


  User: cbauer  
  Date: 07/12/29 21:33:22

  Modified:    examples/wiki/src/main/org/jboss/seam/wiki/core/preferences   
                        WikiPreferenceProvider.java
                        WikiPreferenceValue.java
                        PreferenceValueUserType.java
  Log:
  Complete overhaul of the preferences system
  
  Revision  Changes    Path
  1.8       +185 -157  jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/preferences/WikiPreferenceProvider.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: WikiPreferenceProvider.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/preferences/WikiPreferenceProvider.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -b -r1.7 -r1.8
  --- WikiPreferenceProvider.java	19 Dec 2007 04:29:32 -0000	1.7
  +++ WikiPreferenceProvider.java	30 Dec 2007 02:33:22 -0000	1.8
  @@ -1,17 +1,15 @@
   package org.jboss.seam.wiki.core.preferences;
   
  -import org.hibernate.Session;
  -import org.hibernate.validator.InvalidValue;
   import org.jboss.seam.ScopeType;
   import org.jboss.seam.annotations.*;
   import org.jboss.seam.log.Log;
   import org.jboss.seam.wiki.core.model.User;
  -import org.jboss.seam.wiki.core.model.WikiDocument;
  -import org.jboss.seam.wiki.core.model.WikiNode;
  -import org.jboss.seam.wiki.preferences.PreferenceComponent;
  -import org.jboss.seam.wiki.preferences.PreferenceProperty;
  +import org.jboss.seam.wiki.core.engine.WikiMacro;
   import org.jboss.seam.wiki.preferences.PreferenceProvider;
   import org.jboss.seam.wiki.preferences.PreferenceValue;
  +import org.jboss.seam.wiki.preferences.PreferenceVisibility;
  +import org.jboss.seam.wiki.preferences.metamodel.PreferenceEntity;
  +import org.jboss.seam.wiki.preferences.metamodel.PreferenceRegistry;
   
   import javax.persistence.EntityManager;
   import java.io.Serializable;
  @@ -21,205 +19,235 @@
    * Implementation for the wiki, loads and stores <tt>WikiPreferenceValue</tt> objects.
    * <p>
    * This implementation tries to be as smart as possible and supports multi-level preference value overrides.
  - * If you load values, they are automatically resolved for system, user, and instance levels. If you store
  - * values, they are converted into the appropriate level (whatever the property setting of the meta model allows).
  + * If you load values, they are automatically resolved for system, user, and instance levels. If a value is
  + * present at system level but you want values for users, this implementation creates and returns those
  + * missing values. It will also persist them if you call <tt>store()</tt> and <tt>flush()</tt>.
  + * </p>
  + * <p>
  + * System and user-level values are loaded and stored in the database with the <tt>entityManager</tt>
  + * persistence context. be careful to only flush it if you want to after you retrieved and modified
  + * values with this provider.
  + * </p>
  + * <p>
  + * Instance-level values are not stored in the database, they are marshalled by converting <tt>WikiMacro</tt>
  + * (the instance this provider understands) parameters.
  + * </p>
    *
    * @author Christian Bauer
    */
   @Name("preferenceProvider")
   @AutoCreate
   @Scope(ScopeType.CONVERSATION)
  -public class WikiPreferenceProvider implements PreferenceProvider, Serializable {
  +public class WikiPreferenceProvider implements PreferenceProvider<User, WikiMacro>, Serializable {
   
       @Logger Log log;
   
       @In
       EntityManager entityManager;
   
  -    private Map<PreferenceComponent, Set<PreferenceValue>> currentValueMap = new HashMap<PreferenceComponent, Set<PreferenceValue>>();
  -    private Set<PreferenceValue> queuedNewValues = new HashSet<PreferenceValue>();
  +    @In
  +    PreferenceRegistry preferenceRegistry;
  +
  +    // Queue in current conversation until flush()
  +    List<PreferenceValue> newValueHolders = new ArrayList<PreferenceValue>();
   
  -    public Set<PreferenceValue> load(PreferenceComponent component, Object user, Object instance, boolean includeSystemPreferences) {
  -        log.debug("Loading preference values for component '" + component.getName() + "' and user '" + user + "' and instance '" + instance + "'");
  +    public Set<PreferenceValue> loadValues(String preferenceEntityName,
  +                                           User user, WikiMacro instance,
  +                                           List<PreferenceVisibility> visibilities) {
   
  -        if (currentValueMap.get(component) != null) {
  -            log.debug("Returning cached preference values of current conversation");
  -            return currentValueMap.get(component);
  -        } else {
  -            log.debug("Resolving preference values and storing them in current conversation");
  -            currentValueMap.put(component, new TreeSet<PreferenceValue>());
  +        log.debug("assembling preference values for '"
  +                    + preferenceEntityName
  +                    + "' and user '" + user
  +                    + "' and wiki macro ' " + instance + "'");
   
  -            // Only load and instance preferences if there actually can be instance preferences
  -            if (instance != null && ((WikiNode)instance).getId() != null && component.allowsInstanceOverride())
  -                loadInstanceValues(currentValueMap.get(component), component, (WikiNode)instance);
  +        PreferenceEntity entity = preferenceRegistry.getPreferenceEntitiesByName().get(preferenceEntityName);
  +        SortedSet<PreferenceValue> valueHolders = new TreeSet<PreferenceValue>();
   
  -            // Only load and user preferences if there actually can be user preferences
  -            if (user != null && component.allowsUserOverride())
  -                loadUserValues(currentValueMap.get(component), component, (User)user);
  +        Set<PreferenceValue> systemValueHolders = null;
  +        if (visibilities.contains(PreferenceVisibility.SYSTEM)) {
  +            log.trace("retrieving SYSTEM preference values from database");
   
  -            // Always load system preferences
  -            loadSystemValues(currentValueMap.get(component), component, includeSystemPreferences);
  +            systemValueHolders = loadSystemValues(preferenceEntityName);
   
  -            return currentValueMap.get(component);
  +            // Check if all SYSTEM-level properties were present in the database
  +            for (PreferenceEntity.Property systemVisibleProperty : entity.getPropertiesSystemVisible()) {
  +                WikiPreferenceValue newValueHolder = new WikiPreferenceValue(systemVisibleProperty);
  +                // If not, queue a new value holder (with a null "value") for that property and return it
  +                if (!systemValueHolders.contains(newValueHolder)) {
  +                    systemValueHolders.add(newValueHolder);
  +                    newValueHolders.add(newValueHolder);
           }
       }
  +            valueHolders.addAll(systemValueHolders);
  +        }
   
  -    public Set<PreferenceValue> store(PreferenceComponent component, Set<PreferenceValue> valueHolders, Object user, Object instance) {
  -        log.debug("Storing preference values for component '" + component.getName() + "' and user '" + user + "' and instance '" + instance + "'");
  -
  -        currentValueMap.put(component, new TreeSet<PreferenceValue>());
  -
  -        for (PreferenceValue valueHolder : valueHolders) {
  -            log.trace("Storing preference value: " + valueHolder.getPreferenceProperty().getName() + " value: " + valueHolder.getValue());
  -
  -            if (instance != null &&
  -                    valueHolder.getPreferenceProperty().allowsInstanceOverride() &&
  -                    (valueHolder.isSystemAssigned() || valueHolder.isUserAssigned()) &&
  -                    valueHolder.isDirty()) {
  -
  -                log.trace("New preference value object at INSTANCE level for property: " + valueHolder.getPreferenceProperty());
  +        Set<PreferenceValue> userValueHolders;
  +        if (visibilities.contains(PreferenceVisibility.USER)) {
  +            if (user == null)
  +                throw new IllegalArgumentException("can't load preferences for null user");
  +            log.trace("retrieving USER preference values from database");
   
  -                WikiPreferenceValue newValueHolder = new WikiPreferenceValue(valueHolder.getPreferenceProperty());
  -                newValueHolder.setDocument((WikiDocument) instance);
  -                newValueHolder.setValue(valueHolder.getValue());
  -                newValueHolder.setDirty(false); // New object is not "dirty"
  +            userValueHolders = loadUserValues(preferenceEntityName, user);
   
  -                queuedNewValues.add(newValueHolder);
  -                getSession().evict(valueHolder);
  -                currentValueMap.get(component).add(newValueHolder);
  +            // We need them when we iterate through missing properties next
  +            if (systemValueHolders == null) systemValueHolders = loadSystemValues(preferenceEntityName);
   
  -            } else if (user != null &&
  -                    valueHolder.getPreferenceProperty().allowsUserOverride() &&
  -                    valueHolder.isSystemAssigned() &&
  -                    valueHolder.isDirty()) {
  +            // Check if all USER-level properties were present in the database
  +            for (PreferenceEntity.Property userVisibleProperty : entity.getPropertiesUserVisible()) {
  +                WikiPreferenceValue newValueHolder = new WikiPreferenceValue(userVisibleProperty);
   
  -                log.trace("New preference value object at USER level for property: " + valueHolder.getPreferenceProperty());
  +                // If not, queue a new value for that property and return it
  +                if (!userValueHolders.contains(newValueHolder)) {
  +                    log.trace("creating new preference value for user, missing in database " + userVisibleProperty);
  +                    userValueHolders.add(newValueHolder);
  +                    newValueHolders.add(newValueHolder);
   
  -                WikiPreferenceValue newValueHolder = new WikiPreferenceValue(valueHolder.getPreferenceProperty());
  -                newValueHolder.setUser((User) user);
  -                newValueHolder.setValue(valueHolder.getValue());
  -                newValueHolder.setDirty(false); // New object is not "dirty"
  +                    newValueHolder.setUser(user);
   
  -                queuedNewValues.add(newValueHolder);
  -                getSession().evict(valueHolder);
  -                currentValueMap.get(component).add(newValueHolder);
  -            } else {
  -                currentValueMap.get(component).add(valueHolder);
  +                    // We need a "value" for that property, let's check if we have a SYSTEM-level property we can take it from
  +                    if (userVisibleProperty.getVisibility().contains(PreferenceVisibility.SYSTEM) &&
  +                        systemValueHolders != null && systemValueHolders.contains(newValueHolder)) {
  +                        for (PreferenceValue systemValue : systemValueHolders) {
  +                            if (systemValue.equals(newValueHolder)) {
  +                                log.trace("taking the initial value from the SYSTEM-level setting");
  +                                newValueHolder.setValue(systemValue.getValue());
  +                                newValueHolder.setDirty(false); // New value isn't dirty, by definition
               }
           }
  -
  -        return currentValueMap.get(component);
       }
  -
  -
  -    public void deleteUserPreferences(Object user) {
  -        log.debug("Deleting all preference values of user '" + user + "'");
  -        entityManager.createQuery("delete from WikiPreferenceValue wp where wp.user = :user and wp.document is null")
  -                .setParameter("user", user)
  -                .executeUpdate();
  +                    // If we don't have a value, well, then it's null (this is a property with USER and no SYSTEM visibility)
  +                }
       }
   
  -    public void deleteInstancePreferences(Object instance) {
  -        log.debug("Deleting all preference values of instance '" + instance + "'");
  -        entityManager.createQuery("delete from WikiPreferenceValue wp where wp.user is null and wp.document = :node")
  -                .setParameter("node", instance)
  -                .executeUpdate();
  +            // Override SYSTEM values
  +            valueHolders.removeAll(userValueHolders);
  +            valueHolders.addAll(userValueHolders);
       }
   
  -    public void flush() {
  -        log.debug("Flushing queued preference values of this conversation to the database");
  +        if (visibilities.contains(PreferenceVisibility.INSTANCE)) {
  +            if (instance == null)
  +                throw new IllegalArgumentException("can't load preferences for null WikiMacro instance");
  +            log.trace("extracting INSTANCE preference values from " + instance);
  +            Set<PreferenceValue> instanceValues = loadInstanceValues(preferenceEntityName, instance);
  +            // Override SYSTEM and USER values
  +            valueHolders.removeAll(instanceValues);
  +            valueHolders.addAll(instanceValues);
  +        }
   
  -        // Persist new values (we need to do this during final flush because otherwise we have the persist()/identity generator problem
  -        for (PreferenceValue queuedNewValue : queuedNewValues) {
  -            log.trace("Persisting new preference value object: " + queuedNewValue);
  -            entityManager.persist(queuedNewValue);
  +        return valueHolders;
           }
   
  -        // Don't flush invalid values
  -        // (invalid values at this point come from the plugin prefs editor, users might click Update even with wrong values in the form)
  -        for (Map.Entry<PreferenceComponent, Set<PreferenceValue>> entry : currentValueMap.entrySet()) {
  +    public void storeValues(Set<PreferenceValue> valueHolders, User user, WikiMacro instance) {
  +        // TODO: We don't care about the arguments, maybe instance later on when we marshall stuff into WikiMacro params
   
  -            Set<PreferenceValue> invalidValues = new HashSet<PreferenceValue>();
  -            Map<PreferenceProperty, InvalidValue[]> validatedProperties = entry.getKey().validate(entry.getValue());
  -            for (Map.Entry<PreferenceProperty, InvalidValue[]> validationErrors: validatedProperties.entrySet()) {
  -                if (validationErrors.getValue().length >0) {
  -                    WikiPreferenceValue dummy = new WikiPreferenceValue(validationErrors.getKey());
  -                    invalidValues.add(dummy);
  +        // The new ones need to be checked if they are dirty and manually persisted
  +        for (PreferenceValue newPreferenceValue : newValueHolders) {
  +            if (newPreferenceValue.isDirty()) {
  +                log.debug("storing new preference value " + newPreferenceValue);
  +                entityManager.persist(newPreferenceValue);
                   }
               }
   
  -            for (PreferenceValue preferenceValue : entry.getValue()) {
  -                if (invalidValues.contains(preferenceValue)) {
  -                    log.trace("Evicting invalid preference value from persistence context before flush: " + preferenceValue);
  -                    getSession().evict(preferenceValue);
  -                }
  +        // The old ones are automatically checked for dirty state by Hibernate
  +
               }
  +
  +    public void deleteUserPreferenceValues(User user) {
  +        // NOOP, deleted by foreign key cascade on PREFERENCE table
           }
   
  -        log.trace("Flushing persistence context");
  +    public void flush() {
  +        log.debug("flushing preference provider");
           entityManager.flush();
  +
  +        // Reset queue
  +        newValueHolders = new ArrayList<PreferenceValue>();
       }
   
  -    /* #################### IMPLEMENTATION ######################### */
   
  -    private void loadSystemValues(Set<PreferenceValue> loadedValues, PreferenceComponent preferenceComponent, boolean includeSystemPreferences) {
  -        //noinspection unchecked
  +    /* ######################################### IMPLEMENTATION DETAILS ######################################### */
  +
  +    private Set<PreferenceValue> loadSystemValues(String entityName) {
           List<WikiPreferenceValue> values =
               entityManager.createQuery(
                               "select wp from WikiPreferenceValue wp" +
  -                            " where wp.componentName = :name and wp.user is null and wp.document is null"
  -                          ).setParameter("name", preferenceComponent.getName())
  -                           .setHint("org.hibernate.cacheable", true).getResultList();
  -
  -        for (WikiPreferenceValue value : values) {
  -            PreferenceProperty property = preferenceComponent.getPropertiesByName().get( value.getPropertyName() );
  -            if (property == null)
  -                throw new RuntimeException("Orphaned preference value found in database, please clean up: " + value);
  -            value.setPreferenceProperty(property);
  -            if (value.getPreferenceProperty().allowsUserOverride() ||
  -                value.getPreferenceProperty().allowsInstanceOverride() ||
  -                includeSystemPreferences) {
  -                loadedValues.add(value);
  -            }
  -        }
  +                            " where wp.entityName = :name and wp.user is null"
  +                          ).setParameter("name", entityName)
  +                           .setHint("org.hibernate.cacheable", true)
  +                           .getResultList();
  +        setPropertyReferences(values, entityName, PreferenceVisibility.SYSTEM);
  +        return new HashSet(values);
       }
   
  -    private void loadUserValues(Set<PreferenceValue> loadedValues, PreferenceComponent preferenceComponent, User user) {
  -        //noinspection unchecked
  +    private Set<PreferenceValue> loadUserValues(String entityName, User user) {
           List<WikiPreferenceValue> values =
               entityManager.createQuery(
                               "select wp from WikiPreferenceValue wp" +
  -                            " where wp.componentName = :name and wp.user = :user and wp.document is null"
  -                          )
  -                        .setParameter("name", preferenceComponent.getName())
  +                            " where wp.entityName = :name and wp.user = :user"
  +                          ).setParameter("name", entityName)
                           .setParameter("user", user)
                           .setHint("org.hibernate.cacheable", true)
                           .getResultList();
  -        for (WikiPreferenceValue value : values) {
  -            value.setPreferenceProperty(preferenceComponent.getPropertiesByName().get( value.getPropertyName() ));
  -            loadedValues.add(value);
  +        setPropertyReferences(values, entityName, PreferenceVisibility.USER);
  +        return new HashSet(values);
  +    }
  +
  +    private Set<PreferenceValue> loadInstanceValues(String entityName, WikiMacro instance) {
  +        Set<PreferenceValue> valueHolders = new HashSet<PreferenceValue>();
  +        PreferenceEntity preferenceEntity = preferenceRegistry.getPreferenceEntitiesByName().get(entityName);
  +        for (Map.Entry<String, String> entry : instance.getParams().entrySet()) {
  +            log.trace("converting WikiMacro argument into WikiPreferenceValue: " + entry.getKey());
  +
  +            // TODO: Maybe we should log the following as DEBUG level, these occur when the user edits macro parameters
  +
  +            PreferenceEntity.Property property = preferenceEntity.getPropertiesByName().get(entry.getKey());
  +            if (property == null) {
  +                log.info("can't convert unknown property as WikiMacro argument: " + entry.getKey());
  +                continue;
  +            }
  +            if (!property.getVisibility().contains(PreferenceVisibility.INSTANCE)) {
  +                log.info("can't convert WikiMacro argument, not overridable at INSTANCE level: " + entry.getKey());
  +                continue;
  +            }
  +            WikiPreferenceValue value = new WikiPreferenceValue(property, entry.getValue());
  +            if (value.getValue() != null) {
  +                log.trace("converted WikiMacro argument value into WikiPreferenceValue: " + value.getValue());
  +                valueHolders.add(value);
  +            } else {
  +                log.info("could not convert WikiMacro argument value into WikiPreferenceValue: " + entry.getKey());
  +            }
           }
  +        return valueHolders;
       }
   
  -    private void loadInstanceValues(Set<PreferenceValue> loadedValues, PreferenceComponent preferenceComponent, WikiNode node) {
  -        //noinspection unchecked
  -        List<WikiPreferenceValue> values =
  -            entityManager.createQuery(
  -                            "select wp from WikiPreferenceValue wp" +
  -                            " where wp.componentName = :name and wp.user is null and wp.document = :node"
  -                          )
  -                        .setParameter("name", preferenceComponent.getName())
  -                        .setParameter("node", node)
  -                        .setHint("org.hibernate.cacheable", true)
  -                        .getResultList();
  -        for (WikiPreferenceValue value : values) {
  -            value.setPreferenceProperty(preferenceComponent.getPropertiesByName().get( value.getPropertyName() ));
  -            loadedValues.add(value);
  +    private void setPropertyReferences(List<WikiPreferenceValue> valueHolders, String entityName, PreferenceVisibility visibility) {
  +        Iterator<WikiPreferenceValue> it = valueHolders.iterator();
  +        while (it.hasNext()) {
  +            WikiPreferenceValue wikiPreferenceValue = it.next();
  +            if (!setPropertyReference(wikiPreferenceValue, entityName, visibility)) {
  +                 it.remove(); // Kick out the value if we couldn't set a reference to the metamodel property
  +            }
           }
       }
   
  -    private Session getSession() {
  -        return (Session)entityManager.getDelegate();
  +    private boolean setPropertyReference(WikiPreferenceValue value, String entityName, PreferenceVisibility visibility) {
  +        PreferenceEntity entity = preferenceRegistry.getPreferenceEntitiesByName().get(entityName);
  +        if (entity == null) {
  +            log.warn("orphaned preference value found in database, please clean up: " + value);
  +            return false;
       }
  +        PreferenceEntity.Property property = entity.getPropertiesByName().get(value.getPropertyName());
  +        if (property == null) {
  +            log.warn("orphaned preference value found in database, please clean up: " + value);
  +            return false;
  +        }
  +        if (!property.getVisibility().contains(visibility)) {
  +            log.warn("database visibility " + visibility  + " is not allowed by property, please clean up: " + value);
  +            return false;
  +        }
  +        value.setPreferenceProperty(property);
  +        return true;
  +    }
  +
   
   }
  
  
  
  1.9       +59 -69    jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/preferences/WikiPreferenceValue.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: WikiPreferenceValue.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/preferences/WikiPreferenceValue.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -b -r1.8 -r1.9
  --- WikiPreferenceValue.java	19 Dec 2007 04:29:32 -0000	1.8
  +++ WikiPreferenceValue.java	30 Dec 2007 02:33:22 -0000	1.9
  @@ -9,37 +9,14 @@
   import org.hibernate.annotations.TypeDef;
   import org.hibernate.annotations.TypeDefs;
   import org.jboss.seam.wiki.core.model.User;
  -import org.jboss.seam.wiki.core.model.WikiDocument;
  -import org.jboss.seam.wiki.preferences.PreferenceProperty;
   import org.jboss.seam.wiki.preferences.PreferenceValue;
  +import org.jboss.seam.wiki.preferences.metamodel.PreferenceEntity;
   
   import javax.persistence.*;
   import java.io.Serializable;
  +import java.util.Date;
  +import java.text.SimpleDateFormat;
   
  -/**
  - * Stores preference values in three tables.
  - * <pre>
  - * PREF_ID  PREF_NAME     ATTRIBUTE_NAME  *_VALUE
  - * 1        fooGroup       fooAttribute    ...
  - * 2        fooGroup       fooAttribute    ...
  - * 3        fooGroup       fooAttribute    ...
  - * 4        barGroup       barAttribute    ...
  - * 5        barGroup       barAttribute    ...
  - *
  - * PREF_ID    USER_ID
  - * 2          1
  - * 5          1
  - *
  - * PREF_ID    NODE_ID
  - * 3          1
  - * </pre>
  - * <p>
  - * Can handle Long, Double, Date, Boolean, and String values with a Hibernate UserType.
  - * Could be rewritten to use one table (one-to-one between this entity and user, node) but
  - * we avoid <i>some</i> nullable columns that way.
  - *
  - * @author Christian Bauer
  -*/
   @TypeDefs({
       @TypeDef(name="preference_value_usertype", typeClass = PreferenceValueUserType.class)
   })
  @@ -54,10 +31,10 @@
   
       @Version
       @Column(name = "OBJ_VERSION", nullable = false)
  -    private int version;
  +    private int version = 0;
   
  -    @Column(name = "COMPONENT_NAME", nullable = false)
  -    private String componentName;
  +    @Column(name = "ENTITY_NAME", nullable = false)
  +    private String entityName;
   
       @Column(name = "PROPERTY_NAME", nullable = false)
       private String propertyName;
  @@ -68,12 +45,6 @@
       @org.hibernate.annotations.OnDelete(action = org.hibernate.annotations.OnDeleteAction.CASCADE)
       private User user;
   
  -    @ManyToOne(fetch = FetchType.EAGER)
  -    @JoinColumn(name = "WIKI_DOCUMENT_ID", nullable = true, updatable = false)
  -    @org.hibernate.annotations.ForeignKey(name = "FK_PREFERENCE_WIKI_DOCUMENT_ID")
  -    @org.hibernate.annotations.OnDelete(action = org.hibernate.annotations.OnDeleteAction.CASCADE)
  -    private WikiDocument document;
  -
       @org.hibernate.annotations.Type(type = "preference_value_usertype")
       @org.hibernate.annotations.Columns(
           columns = {
  @@ -86,12 +57,42 @@
   	)
       private Object value;
   
  +    @Transient
  +    private boolean instance = false;
  +
       public WikiPreferenceValue() {}
   
  -    public WikiPreferenceValue(PreferenceProperty forProperty) {
  -        this.componentName = forProperty.getPreferenceComponent().getName();
  -        this.propertyName = forProperty.getName();
  -        this.property = forProperty;
  +    public WikiPreferenceValue(PreferenceEntity.Property property) {
  +        this.entityName = property.getOwningEntityName();
  +        this.propertyName = property.getFieldName();
  +        this.property = property;
  +    }
  +
  +    public WikiPreferenceValue(PreferenceEntity.Property property, String value) {
  +        this.entityName = property.getOwningEntityName();
  +        this.propertyName = property.getFieldName();
  +        this.property = property;
  +        this.instance = true;
  +
  +        if (property.getFieldType().equals(String.class)) {
  +            this.value = value;
  +        } else if (property.getFieldType().equals(Long.class)) {
  +            try {
  +                this.value = Long.valueOf(value);
  +            } catch (Exception ex) {}
  +        } else if (property.getFieldType().equals(Double.class)) {
  +            try {
  +                this.value = Double.valueOf(value);
  +            } catch (Exception ex) {}
  +        } else if (property.getFieldType().equals(Date.class)) {
  +            try {
  +                this.value = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(value);
  +            } catch (Exception ex) {}
  +        } else if (property. getFieldType().equals(Boolean.class)) {
  +            try {
  +                this.value = Boolean.valueOf(value);
  +            } catch (Exception ex) {}
  +        }
       }
   
       public Long getId() {
  @@ -102,12 +103,12 @@
           return version;
       }
   
  -    public String getComponentName() {
  -        return componentName;
  +    public String getEntityName() {
  +        return entityName;
       }
   
  -    public void setComponentName(String componentName) {
  -        this.componentName = componentName;
  +    public void setEntityName(String entityName) {
  +        this.entityName = entityName;
       }
   
       public String getPropertyName() {
  @@ -126,14 +127,6 @@
           this.user = user;
       }
   
  -    public WikiDocument getDocument() {
  -        return document;
  -    }
  -
  -    public void setDocument(WikiDocument document) {
  -        this.document = document;
  -    }
  -
       public Object getValue() {
           return value;
       }
  @@ -148,29 +141,28 @@
           this.value = value;
       }
   
  -    public boolean isSystemAssigned() {
  -        return getDocument() == null && getUser() == null;
  +    public boolean isSystem() {
  +        return user == null && !instance;
       }
   
  -    public boolean isUserAssigned() {
  -        return getDocument() == null && getUser() != null;
  +    public boolean isUser() {
  +        return user != null && !instance;
       }
   
  -    public boolean isInstanceAssigned() {
  -        return getDocument() != null && getUser() == null;
  +    public boolean isInstance() {
  +        return user == null && instance;
       }
   
  -    // Useful for provider
       @Transient
       private boolean dirty;
       public boolean isDirty() { return dirty; }
       public void setDirty(boolean dirty) { this.dirty = dirty; }
   
  -    // Reference to meta model
       @Transient
  -    PreferenceProperty property;
  -    public void setPreferenceProperty(PreferenceProperty property) { this.property = property; }
  -    public PreferenceProperty getPreferenceProperty() { return property; }
  +    PreferenceEntity.Property property;
  +
  +    public void setPreferenceProperty(PreferenceEntity.Property property) { this.property = property; }
  +    public PreferenceEntity.Property getPreferenceProperty() { return property; }
   
       public boolean equals(Object o) {
           if (this == o) return true;
  @@ -178,7 +170,7 @@
   
           WikiPreferenceValue that = (WikiPreferenceValue) o;
   
  -        if (!componentName.equals(that.componentName)) return false;
  +        if (!entityName.equals(that.entityName)) return false;
           if (!propertyName.equals(that.propertyName)) return false;
   
           return true;
  @@ -186,18 +178,16 @@
   
       public int hashCode() {
           int result;
  -        result = componentName.hashCode();
  +        result = entityName.hashCode();
           result = 31 * result + propertyName.hashCode();
           return result;
       }
   
       public int compareTo(Object o) {
  -        return getPreferenceProperty().getDescription().compareTo(
  -                    ((PreferenceValue)o).getPreferenceProperty().getDescription()
  -               );
  +        return getPreferenceProperty().compareTo(((PreferenceValue)o).getPreferenceProperty());
       }
   
       public String toString() {
  -        return "WikiPreferenceValue for '" + getComponentName() + "." + getPropertyName() + "'";
  +        return "WikiPreferenceValue for '" + getEntityName() + "." + getPropertyName() + "'";
       }
   }
  
  
  
  1.2       +1 -1      jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/preferences/PreferenceValueUserType.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: PreferenceValueUserType.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/preferences/PreferenceValueUserType.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -b -r1.1 -r1.2
  
  
  



More information about the jboss-cvs-commits mailing list