Ignore:
Timestamp:
07/12/13 23:41:06 (11 years ago)
Author:
psniegowski
Message:

HIGHLIGHTS:

  • add <include/> to configuration
  • add side notes to tree
    • used to store arbitrary information alongside the tree structure
  • migrate to log4j2
    • supports lazy string evaluation of passed arguments
  • improve GUI tree
    • it stays in synchronization with actual state (even in high load test scenario)
  • improve panel management in GUI
  • make loading objects in GUI more lazy
  • offload parsing to connection receiver thread
    • info parsing
    • first step of objects parsing
  • fix connection parsing bug (eof in long values)
  • support zero-arguments procedure in table view

CHANGELOG:
Implement procedure calls from table view.

Refactorization around procedures in tables.

Add table editor for buttons.

Render buttons in the the list view.

Further improve Columns.

Add Column class for TableModel?.

Accept also non-arguments ProcedureParams? in tableView.

Increase maximal TextAreaControl? size.

Add tooltip to ProcedureControl?.

Fix bug of interpreting eofs in long values by connection reader.

Further rework connection parsing.

Simplify client connection processing.

Test ListChange? modification.

Test ListChange? events with java server.

Add TestChild?.

Fix bug with fast deregistering when connecting to running server.

Another minor refactorization in TreeOperations?.

Fix bug in SimpleAbstractAccess? loading routine.

Another minor improvement.

Minor change.

Make reading of List objects two-phase.

Another minor change.

Dispatch parsing into receiver thread.

Another step.

Enclose passing value in ObjectParam? case in closure.

Minor step.

Minor change on way to offload parsing.

Temporarily comment out single ValueParam? get.

It will be generalized to multi ValueParam?.

Process info in receiver thread.

Add DispatchingExceptionHandler?.

Make waits in browser test longer.

Use FETCHED_MARK.

It is honored in GUI, where it used to decide whether to get values

after user action.

It is set in standard algorithm for processing fetched values.

Add remove operation to side notes.

Make loading more lazy.

Improve loading policy.

On node choose load itself, on node expansion, load children.

Minor improvement.

Fix bug with panel interleaving.

Minor improvements.

Improve panel management.

More cleaning around panels.

Reorganize panels.

Further improve tree.

Fix bug in TreeModel?.

Remove children from TreeNode?.

Implement TreeNode? hashCode and equals.

Make TreeNode? delegate equals and hashcode to internal reference.

Move listeners from TreeNode? to side notes.

Store path.textual as a side note.

Side note params instead of accesses for objects.

More refactorizations.

In TreeNode? bindAccess based on side notes.

Minor step.

Hide createAccess.

Rename AccessInterface? to Access.

Minor changes.

Several improvements in high load scenarios.

Change semantics of ArrayListAccess?.set(index, null);

It now removes the element, making list shorter
(it was set to null before).

Add path remove handler.

Handle exceptions in Connection.

Update .gitignore

Configure logging to file.

Move registration to TreeModel?.

Further refactorization.

Minor refactorization.

Minor improvements.

Use specialized event also for Modify action of ListChange?.

Use remove events.

Use the insertion events for tree.

Further improve tree refreshing.

Further improve reacting on events in GUI.

Fix problem with not adding objects on addition list change.

Migrate to log4j lazy String construction interface.

Migrate imports to log4j2.

Drop dependency on adapter to version 1.2.

Switch log4j implementation to log4j2.

Add dirty mark to the NodeAtFrame?.

Make selecting in AccessInterfaces? type safe.

Ignore containers size settings in Model and Genotype.

Use tree side notes to remember local changes and panels.

Add sideNotes to tree.

They will be used to store various accompanying information
right in the tree.

Use ReferenceIdentityMap? from apache in TreeNode?.

It suits the need perfectly (weak semantics on both key and value).

Make ArrayListParam? do not react size changes.

Guard in TableModel? before not yet loaded objects.

Add <include/> clause and AutoInjector?.

Extract common columns configuration to separate xml,
that can be included by other configurations.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • java/main/src/main/java/com/framsticks/core/AbstractTree.java

    r99 r100  
    11package com.framsticks.core;
    22
     3import java.util.Map;
     4
    35import javax.annotation.Nonnull;
    46
    5 import org.apache.log4j.Logger;
    6 
    7 import com.framsticks.params.AccessInterface;
     7import org.apache.commons.collections.map.ReferenceIdentityMap;
     8import org.apache.logging.log4j.Logger;
     9import org.apache.logging.log4j.LogManager;
     10
     11import com.framsticks.params.Access;
    812import com.framsticks.params.CompositeParam;
    913import com.framsticks.params.FramsClass;
     
    1418import com.framsticks.params.annotations.ParamAnnotation;
    1519import com.framsticks.util.FramsticksException;
     20import com.framsticks.util.Misc;
    1621import com.framsticks.util.dispatching.AbstractJoinable;
    1722import com.framsticks.util.dispatching.Dispatcher;
     
    2530import com.framsticks.util.dispatching.Thread;
    2631import com.framsticks.util.dispatching.ThrowExceptionHandler;
     32import com.framsticks.util.lang.Casting;
    2733
    2834/**
     
    3238public abstract class AbstractTree extends AbstractJoinable implements Dispatcher<Tree>, Tree, JoinableParent {
    3339
    34         private static final Logger log = Logger.getLogger(AbstractTree.class);
     40        private static final Logger log = LogManager.getLogger(AbstractTree.class);
    3541
    3642        private Node root = null;
     
    4551                }
    4652                root = new Node(this, param, null);
    47                 log.debug("assigned root type: " + root);
     53                log.debug("assigned root type: {}", root);
    4854        }
    4955
     
    5763                }
    5864                root = new Node(this, root.getParam(), object);
    59                 log.debug("assigned root object: " + root);
     65                log.debug("assigned root object: {}", root);
    6066        }
    6167
     
    9399
    94100        @Override
    95         public @Nonnull AccessInterface prepareAccess(CompositeParam param) {
     101        public @Nonnull Access prepareAccess(CompositeParam param) {
    96102                return registry.prepareAccess(param);
    97103        }
     
    104110        @AutoAppendAnnotation
    105111        public void usePackage(ParamsPackage paramsPackage) {
    106                 log.debug("using package " + paramsPackage + " in tree " + this);
     112                log.debug("using package {} in tree {}", paramsPackage, this);
    107113                paramsPackage.register(registry);
    108114        }
     
    110116        @AutoAppendAnnotation
    111117        public void takeFromRegistry(Registry registry) {
    112                 log.debug("taking from registry " + registry + " in tree " + this);
     118                log.debug("taking from registry {} in tree {}", registry, this);
    113119                this.registry.takeAllFrom(registry);
    114120        }
     
    231237        }
    232238
     239
     240        @SuppressWarnings("unchecked")
     241        protected final Map<Object, Object> sideNotes = (Map<Object, Object>) new ReferenceIdentityMap(ReferenceIdentityMap.WEAK, ReferenceIdentityMap.HARD);
     242
     243        @Override
     244        public void putSideNote(Object object, Object key, Object value) {
     245                assert isActive();
     246                Misc.throwIfNull(object);
     247                Misc.throwIfNull(key);
     248                Misc.throwIfNull(value);
     249                Object sideNote = sideNotes.get(object);
     250                if (sideNote == null) {
     251                        sideNote = new ReferenceIdentityMap(ReferenceIdentityMap.WEAK, ReferenceIdentityMap.HARD);
     252                        sideNotes.put(object, sideNote);
     253                }
     254                @SuppressWarnings("unchecked")
     255                Map<Object, Object> sideNotesMap = (Map<Object, Object>) sideNote;
     256                sideNotesMap.put(key, value);
     257        }
     258
     259        @Override
     260        public <T> T getSideNote(Object object, Object key, Class<T> valueType) {
     261                assert isActive();
     262                Misc.throwIfNull(object);
     263                Misc.throwIfNull(key);
     264                Object sideNote = sideNotes.get(object);
     265                if (sideNote == null) {
     266                        return null;
     267                }
     268                return Casting.nullOrThrowCast(valueType, ((Map<?, ?>) sideNote).get(key));
     269        }
     270
     271        @Override
     272        public boolean removeSideNote(Object object, Object key) {
     273                Object sideNote = sideNotes.get(object);
     274                if (sideNote == null) {
     275                        return false;
     276                }
     277                @SuppressWarnings("unchecked")
     278                Map<Object, Object> sideNotesMap = (Map<Object, Object>) sideNote;
     279                boolean result = (sideNotesMap.remove(key) != null);
     280                if (sideNotesMap.isEmpty()) {
     281                        sideNotes.remove(object);
     282                }
     283                return result;
     284        }
     285
    233286}
    234287
Note: See TracChangeset for help on using the changeset viewer.