implement FileSystemStyleCache code review comments
---------------------------------------------------

                 Key: TRINIDAD-1460
                 URL: https://issues.apache.org/jira/browse/TRINIDAD-1460
             Project: MyFaces Trinidad
          Issue Type: Improvement
          Components: Skinning
            Reporter: Jeanne Waldman
            Priority: Minor


Code review comments from Blake Sullivan for FileSystemStyleCache:


in  private StyleSheetDocument _getStyleSheetDocument(StyleContext context) 
this part:

    // Otherwise, we create the StyleSheetDocument now
    document = createStyleSheetDocument(context);

    // If we weren't able to create the StyleSheetDocument,
    // use a non-null placeholder
    if (document == null)
      document = _EMPTY_DOCUMENT;

    // Save the document
    if (_document == null)
      _document = document;

    // Re-initialize our Array of namespace prefixes that are in the selectors
    // Re-initialize our Map of short style class names
    _namespacePrefixes = _getNamespacePrefixes(context, _document);
    _shortStyleClassMap = _getShortStyleClassMap(context, _document, 
_namespacePrefixes);

Should probably be in a synchronized block

_document,  _namespacePrefixes, and _shortStyleClassMap should be volatile.

comment about not needing to use Hashtable and HashMap being OK is 
incorrect--_createEntry() which assigns values to _cache and _entryCache is 
called without a lock and these Maps are read without a lock. _cache and 
_entryCache should probably be ConcurrentHashMaps.

  private static class Key

Might as well make the class final as well

Key.hashCode()--hash algorithm is a little weak, since it doesn't spread the 
bits out enough.  Effective Java's version would be better
Key should calculate its hashCode on initialization because:
1) The comment about not needing to synchronize is wrong
2) The very first thing we do is perform a get on the key, so there is no 
performance benefit to not calculating the hashCode aggressively
All fields  should be final, making a nice immutable instance, which we should 
document as such.

The Entry class should also be documented as thread-safe, though, in this case, 
it is only because the List of URIs is implemented as an ArrayList and the List 
isn't modified after the Entry class gets the list.  We will need to document 
this restriction unless we actually copy the list of URIs when creating the 
Entry.

  private static class DerivationKey

Pretty much the same issues as Key--make the class final, make the fields 
final, aggressively calculate the hashCode, fix the hashCode implementation, 
document the class as immutable.


  private DerivationKey _getDerivationKey(

The whole synchronization thing is bogus--the set of style sheets on the 
StyleSheetDocument is immutable, so _copyIterator() should be removed and the 
function written as:

    // Entries with the same style sheet derivation are compatible.
    // Get the style sheet derivation list.
    Iterator<StyleSheetNode> styleSheetNodes = document.getStyleSheets(context);

    // =-= bts note that we could also make a constant private static final 
EMPTY_STYLE_SHEET_NODES =
    //         new StyleSheetNode[0]; which would be better.
    StyleSheetNode[] styleSheets = new StyleSheetNode[0];

    // if we have any style sheets, copy them into an array of the correct type
    if (styleSheetNodes.hasNext())
    {
      List<StyleSheetNode> styleSheetNodeList = 
CollectionUtils.arrayList(styleSheetNodes);

      styleSheets = styleSheetNodeList.toArray(styleSheets);
    }

    // Create a key out of the style sheet derivation list
    return new DerivationKey(context, styleSheets);


_getStyleContextResolvedStyles

replace:

    List<StyleNode> v = new ArrayList<StyleNode>();
    while (e.hasNext())
      v.add(e.next());

    return v.toArray(new StyleNode[v.size()]);

with

    List<StyleNode> v = CollectionUtils.arrayList(e);
    return v.toArray(new StyleNode[v.size()]);

dd





-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to