Ignore:
Timestamp:
07/14/13 23:20:04 (11 years ago)
Author:
psniegowski
Message:

HIGHLIGHTS:

  • improve tree side notes
  • improve GUI layout
  • add foldable list of occured events to EventControl?
  • improve automatic type conversion in proxy listeners
  • implement several Access functionalities as algorithms independent of Access type
  • introduce draft base classes for distributed experiments
  • automatically register dependant Java classes to FramsClass? registry
  • add testing prime experiment and configuration
  • simplify and improve task dispatching

CHANGELOG:
Improve task dispatching in RemoteTree?.

GUI no longer hangs on connection problems.

Make all dispatchers joinables.

Refactorize Thread dispatcher.

Remove Task and PeriodicTask?.

Use Java utilities in those situations.

Reworking tasks dispatching.

Fix bug in EventControl? listener dispatching.

Minor improvements.

Add testing configuration for ExternalProcess? in GUI.

More improvement to prime.

Support for USERREADONLY in GUI.

Add that flag to various params in Java classes.

Remove redundant register clauses from several FramsClassAnnotations?.

Automatically gather and register dependant classes.

Add configuration for prime.

Improve Simulator class.

Add prime.xml configuration.

Introduce draft Experiment and Simulator classes.

Add prime experiment tests.

Enclose typical map with listeners into SimpleUniqueList?.

Needfile works in GUI.

Improve needfile handling in Browser.

More improvement with NeedFile?.

Implementing needfile.

Update test.

Rename ChangeEvent? to TestChangeEvent?.

Automatic argument type search in RemoteTree? listeners.

MultiParamLoader? uses AccessProvider?. By default old implementation
enclosed in AccessStash? or Registry.

Minor changes.

Rename SourceInterface? to Source.

Also improve toString of File and ListSource?.

Remove unused SimpleSource? class.

Add clearing in HistoryControl?.

Show entries in table at EventControl?.

Improve EventControl?.

Add listeners registration to EventControl?.

Add foldable table to HistoryControl?.

Add control row to Procedure and Event controls.

Improve layout of controls.

Another minor change to gui layout.

Minor improvement in the SliderControl?.

Minor changes.

Move ReflectionAccess?.Backend to separate file.

It was to cluttered.

Cleanup in ReflectionAccess?.

Move setMin, setMax, setDef to AccessOperations?.

Extract loading operation into AccessOperations?.

Append Framsticks to name of UnsupportedOperationException?.

The java.lang.UnsupportedOperationException? was shadowing this class.

Rename params.Util to params.ParamsUtil?.

Several improvements.

Minor changes.

Implement revert functionality.

Improve local changes management.

Minor improvement.

Remove methods rendered superfluous after SideNoteKey? improvement.

Improve SideNoteKey?.

It is now generic type, so explicit type specification at
call site is no more needed.

Introduce SideNoteKey? interface.

Only Objects implementing that key may be used as side note keys.

Minor improvements.

Use strings instead of ValueControls? in several gui mappings.

File:
1 edited

Legend:

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

    r100 r101  
    11package com.framsticks.core;
    22
     3import java.util.Comparator;
     4import java.util.Iterator;
    35import java.util.Map;
     6import java.util.PriorityQueue;
    47
    58import javax.annotation.Nonnull;
     
    912import org.apache.logging.log4j.LogManager;
    1013
     14import com.framsticks.communication.queries.NeedFile;
     15import com.framsticks.communication.queries.NeedFileAcceptor;
    1116import com.framsticks.params.Access;
    1217import com.framsticks.params.CompositeParam;
    1318import com.framsticks.params.FramsClass;
     19import com.framsticks.params.ParamFlags;
    1420import com.framsticks.params.ParamsPackage;
    1521import com.framsticks.params.Registry;
     
    2026import com.framsticks.util.Misc;
    2127import com.framsticks.util.dispatching.AbstractJoinable;
     28import com.framsticks.util.dispatching.BufferedDispatcher;
    2229import com.framsticks.util.dispatching.Dispatcher;
    2330import com.framsticks.util.dispatching.Dispatching;
    2431import com.framsticks.util.dispatching.ExceptionResultHandler;
    2532import com.framsticks.util.dispatching.Joinable;
    26 import com.framsticks.util.dispatching.JoinableDispatcher;
    2733import com.framsticks.util.dispatching.JoinableParent;
    2834import com.framsticks.util.dispatching.JoinableState;
     
    3036import com.framsticks.util.dispatching.Thread;
    3137import com.framsticks.util.dispatching.ThrowExceptionHandler;
    32 import com.framsticks.util.lang.Casting;
     38import com.framsticks.util.lang.Pair;
    3339
    3440/**
     
    3642 */
    3743@FramsClassAnnotation
    38 public abstract class AbstractTree extends AbstractJoinable implements Dispatcher<Tree>, Tree, JoinableParent {
     44public abstract class AbstractTree extends AbstractJoinable implements Dispatcher<Tree>, Tree, JoinableParent, NeedFileAcceptor {
    3945
    4046        private static final Logger log = LogManager.getLogger(AbstractTree.class);
     
    4349        private ExceptionResultHandler handler = ThrowExceptionHandler.getInstance();
    4450
    45         private JoinableDispatcher<Tree> dispatcher;
     51        protected final BufferedDispatcher<Tree> bufferedDispatcher = new BufferedDispatcher<>();
     52
     53        protected final PriorityQueue<Pair<Integer, NeedFileAcceptor>> needFileAcceptors = new PriorityQueue<>(32, new Comparator<Pair<Integer, NeedFileAcceptor>>() {
     54
     55                @Override
     56                public int compare(Pair<Integer, NeedFileAcceptor> arg0, Pair<Integer, NeedFileAcceptor> arg1) {
     57                        if (arg0.first < arg1.first) {
     58                                return -1;
     59                        }
     60                        if (arg0.first > arg1.first) {
     61                                return 1;
     62                        }
     63                        return 0;
     64                }
     65        });
    4666
    4767        @Override
     
    152172         */
    153173        @Override
    154         public JoinableDispatcher<Tree> getDispatcher() {
    155                 return dispatcher;
     174        public Dispatcher<Tree> getDispatcher() {
     175                return bufferedDispatcher.getTargetDispatcher();
    156176        }
    157177
     
    160180         */
    161181        @Override
    162         public void setDispatcher(JoinableDispatcher<Tree> dispatcher) {
    163                 if (this.dispatcher != null) {
    164                         throw new FramsticksException().msg("dispatcher is already set").arg("tree", this).arg("dispatcher", dispatcher);
    165                 }
    166                 this.dispatcher = dispatcher;
     182        public void setDispatcher(Dispatcher<Tree> dispatcher) {
     183                if (bufferedDispatcher.getTargetDispatcher() != null) {
     184                        throw new FramsticksException().msg("dispatcher is already set").arg("tree", this).arg("dispatcher", bufferedDispatcher.getTargetDispatcher());
     185                }
     186                bufferedDispatcher.setTargetDispatcher(dispatcher);
    167187        }
    168188
     
    170190         * @return the name
    171191         */
    172         @ParamAnnotation
     192        @ParamAnnotation(flags = ParamFlags.USERREADONLY)
    173193        public String getName() {
    174194                return name;
     
    193213        @Override
    194214        protected void joinableStart() {
    195                 if (dispatcher == null) {
    196                         dispatcher = new Thread<Tree>();
    197                 }
    198                 Dispatching.use(dispatcher, this);
     215                if (bufferedDispatcher.getTargetDispatcher() == null) {
     216                        bufferedDispatcher.setTargetDispatcher(new Thread<Tree>());
     217                }
     218                Dispatching.use(bufferedDispatcher.getTargetDispatcher(), this);
    199219        }
    200220
    201221        @Override
    202222        protected void joinableInterrupt() {
    203                 Dispatching.drop(dispatcher, this);
     223                Dispatching.drop(bufferedDispatcher.getTargetDispatcher(), this);
    204224        }
    205225
     
    211231        @Override
    212232        protected void joinableJoin() throws InterruptedException {
    213                 Dispatching.join(dispatcher);
     233                Dispatching.join(bufferedDispatcher.getTargetDispatcher());
    214234        }
    215235
    216236        @Override
    217237        public void childChangedState(Joinable joinable, JoinableState state) {
    218                 if (joinable == dispatcher) {
     238                if (joinable == bufferedDispatcher.getTargetDispatcher()) {
    219239                        proceedToState(state);
    220240                }
     
    223243        @Override
    224244        public boolean isActive() {
    225                 if (dispatcher == null) {
    226                         throw new FramsticksException().msg("no dispatcher is set for tree yet").arg("tree", this);
    227                 }
    228                 return dispatcher.isActive();
     245                return bufferedDispatcher.isActive();
    229246        }
    230247
    231248        @Override
    232249        public void dispatch(RunAt<? extends Tree> runnable) {
    233                 if (dispatcher == null) {
    234                         throw new FramsticksException().msg("no dispatcher is set for tree yet").arg("tree", this);
    235                 }
    236                 dispatcher.dispatch(runnable);
     250                bufferedDispatcher.dispatch(runnable);
    237251        }
    238252
     
    242256
    243257        @Override
    244         public void putSideNote(Object object, Object key, Object value) {
     258        public <T> void putSideNote(Object object, SideNoteKey<T> key, T value) {
    245259                assert isActive();
    246260                Misc.throwIfNull(object);
     
    253267                }
    254268                @SuppressWarnings("unchecked")
    255                 Map<Object, Object> sideNotesMap = (Map<Object, Object>) sideNote;
     269                Map<SideNoteKey<?>, Object> sideNotesMap = (Map<SideNoteKey<?>, Object>) sideNote;
    256270                sideNotesMap.put(key, value);
    257271        }
    258272
    259         @Override
    260         public <T> T getSideNote(Object object, Object key, Class<T> valueType) {
     273        @SuppressWarnings("unchecked")
     274        @Override
     275        public <T> T getSideNote(Object object, SideNoteKey<T> key) {
    261276                assert isActive();
    262277                Misc.throwIfNull(object);
     
    266281                        return null;
    267282                }
    268                 return Casting.nullOrThrowCast(valueType, ((Map<?, ?>) sideNote).get(key));
    269         }
    270 
    271         @Override
    272         public boolean removeSideNote(Object object, Object key) {
     283                Object value = ((Map<SideNoteKey<?>, Object>) sideNote).get(key);
     284                if (value == null) {
     285                        return null;
     286                }
     287                return (T) value;
     288        }
     289
     290        @Override
     291        public boolean removeSideNote(Object object, SideNoteKey<?> key) {
     292                assert isActive();
    273293                Object sideNote = sideNotes.get(object);
    274294                if (sideNote == null) {
     
    276296                }
    277297                @SuppressWarnings("unchecked")
    278                 Map<Object, Object> sideNotesMap = (Map<Object, Object>) sideNote;
     298                Map<SideNoteKey<?>, Object> sideNotesMap = (Map<SideNoteKey<?>, Object>) sideNote;
    279299                boolean result = (sideNotesMap.remove(key) != null);
    280300                if (sideNotesMap.isEmpty()) {
     
    284304        }
    285305
     306        @Override
     307        public void addNeedFileAcceptor(int priority, NeedFileAcceptor acceptor) {
     308                assert isActive();
     309                needFileAcceptors.add(Pair.make(priority, acceptor));
     310        }
     311
     312        @Override
     313        public void removeNeedFileAcceptor(NeedFileAcceptor acceptor) {
     314                assert isActive();
     315                Iterator<Pair<Integer, NeedFileAcceptor>> i = needFileAcceptors.iterator();
     316                while (i.hasNext()) {
     317                        if (i.next().second == acceptor) {
     318                                i.remove();
     319                                break;
     320                        }
     321                }
     322        }
     323
     324        @Override
     325        public boolean acceptNeed(final NeedFile needFile) {
     326                Dispatching.dispatchIfNotActive(this, new RunAt<AbstractTree>(needFile.getFuture()) {
     327
     328                        @Override
     329                        protected void runAt() {
     330                                for (Pair<Integer, NeedFileAcceptor> acceptor : needFileAcceptors) {
     331                                        if (acceptor.second.acceptNeed(needFile)) {
     332                                                return;
     333                                        }
     334                                }
     335                                throw new FramsticksException().msg("failed to find need file acceptor in tree").arg("tree", AbstractTree.this);
     336                        }
     337                });
     338                return true;
     339        }
     340
    286341}
    287342
Note: See TracChangeset for help on using the changeset viewer.