Ignore:
Timestamp:
07/02/13 16:20:07 (11 years ago)
Author:
psniegowski
Message:

HIGHLIGHTS:

CHANGELOG:
Make ProcedureParam? hold only ValueParams?.

Use id instead of names when naming gui components internally.

Basic procedure calling in GUI.

The actual procedure call is currently only backed
by the ObjectInstance?.

Add UnimplementedException?.

Improve naming of various gui elements.

Allow easy navigating in FEST Swing testing.

Add optional explicit order attribute to FramsClassAnnotation?.

That's because java reflection does return declared members
in any specific order. That ordering is needed only for
classes that have no representation in framsticks and need
a deterministic ordering of params.

Add ControlOwner? interface.

Add test for procedure calling in Browser.

First version of ParamAnnotation? for procedures.

Development of ProcedureParam?.

Add draft version of ProcedureParam? implementation in ReflectionAccess?.

Allow viewing FramsClasses? in gui Browser.

Extract ResourceBuilder? from ModelBuilder?.

Remove internalId from Param.

It was currently completely not utilised. Whether it is still needed
after introduction of ParamAnnotation? is arguable.

Add remaining param attributes to ParamAnnotation?.

Change AutoBuilder? semantics.

AutoBuilder? returns list of objects that are to be appended
with methods @AutoAppendAnnotation?.

This allows to omit explicit addition of ModelPackage? to instance
if the instance uses ModelBuilder? (registration of ModelPackage? comes
from schema).

Fix params ordering problem in auto created FramsClasses?.

Improve ObjectInstance?.

Several fixes to ModelBuilder?.

Improve test for ObjectInstance? in Browser.

Make initialization of robot static.

With robot recreated for second browser test, the test hanged
deep in AWT.

Add base convenience base test for Browser tests.

More tests to ObjectInstance?.

Rename Dispatcher.invokeLater() to dispatch().

Add assertDispatch.

It allows assertions in other threads, than TestNGInvoker.
Assertions are gathered after each method invocation and rethrown.

Use timeOut annotation attribute for tests involving some waiting.

Remove firstTask method (merge with joinableStart).

Clean up leftovers.

Remove unused FavouritesXMLFactory (the reading part is already
completely done with generic XmlLoader?, and writing part will be done
based on the same approach if needed).
Move UserFavourite? to the com.framsticks.gui.configuration package.

Remove GenotypeBrowser? as to specific.

This functionality will be available in ObjectInstance?.

Add interface ParamsPackage?.

Package containing registration of Java classes meant to use with
ReflectionAccess? may be in Instance using configuration.

Minor changes.

Make Group immutable.

Add AutoBuilder? interface extending Builder - only those would
be used to automatically build from XML.

Fix groups in FramsClass?.

Minor naming cleanup in Registry.

Add ModelComponent? interface.

All class creating the Model are implementing that interface.

Extract Model.build into ModelBuilder?.

ModelBuilder? will be compatible with other builders
and allow using it from configuration.

Fix NeuroConnection?.

Add synchronous get operation for dispatchers.

Rename JoinableMonitor? to Monitor.

Add ObjectInstance?.

This class is mainly for demonstration
and testing purposes.

Improve FramsServer? runner.

  • improve ExternalProcess? runner,
  • runner can kill the server but also react properly, when the server exists on it's own,
  • set default path to search for framsticks server installation,
  • add LoggingOutputListener?.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • java/main/src/main/java/com/framsticks/running/ExternalProcess.java

    r88 r90  
    1515
    1616import com.framsticks.core.Entity;
     17import com.framsticks.params.annotations.AutoAppendAnnotation;
    1718import com.framsticks.params.annotations.FramsClassAnnotation;
    1819import com.framsticks.params.annotations.ParamAnnotation;
    1920import com.framsticks.util.FramsticksException;
    2021import com.framsticks.util.Misc;
     22import com.framsticks.util.dispatching.AbstractJoinable;
     23import com.framsticks.util.dispatching.Dispatching;
     24import com.framsticks.util.dispatching.Joinable;
     25import com.framsticks.util.dispatching.JoinableParent;
     26import com.framsticks.util.dispatching.JoinableState;
     27import com.framsticks.util.dispatching.RunAt;
    2128import com.framsticks.util.dispatching.Thread;
    2229import com.framsticks.util.io.Encoding;
    2330
    2431@FramsClassAnnotation
    25 public class ExternalProcess extends Thread<ExternalProcess> implements Entity {
     32public class ExternalProcess extends AbstractJoinable implements JoinableParent, Entity {
    2633        private static final Logger log = Logger.getLogger(ExternalProcess.class);
    2734
    2835        protected List<String> arguments = new ArrayList<>();
    2936        protected Process process;
    30         protected ProcessBuilder builder = new ProcessBuilder();
    31         protected Thread<ExternalProcess> readerThread;
     37        protected final ProcessBuilder builder = new ProcessBuilder();
     38        protected Thread<ExternalProcess> readerThread = new Thread<ExternalProcess>();
    3239
    3340        protected PrintWriter input;
     
    3744        protected final List<OutputListener> listeners = new LinkedList<>();
    3845
     46        @AutoAppendAnnotation
    3947        public void addListener(OutputListener listener) {
    4048                synchronized (listeners) {
     
    5058                setName("process");
    5159                arguments.add(null);
     60                builder.redirectErrorStream(true);
    5261        }
    5362
     
    6877        }
    6978
    70         @Override
    71         protected void routine() {
     79        protected void readerTask() {
    7280
    7381                String line;
     
    9199                        }
    92100                        log.debug("process ended " + this);
    93                         process = null;
     101                        // process = null;
    94102                } catch (FramsticksException e) {
    95103                        log.error("exception caught in process " + this, e);
    96104                }
    97105                interrupt();
     106                // finish();
    98107        }
    99 
    100 
    101108
    102109        @ParamAnnotation
     
    111118
    112119        @Override
    113         public void joinableStart() {
    114                 builder = new ProcessBuilder();
     120        protected void joinableStart() {
    115121                log.debug("running process with arguments: " + arguments);
    116122                builder.command(arguments);
     
    119125                        input = new PrintWriter(new OutputStreamWriter(process.getOutputStream(), Encoding.getDefaultCharset()));
    120126                        output = new BufferedReader(new InputStreamReader(process.getInputStream(), Encoding.getDefaultCharset()));
     127
    121128                } catch (IOException e) {
    122129                        throw new FramsticksException().msg("failed to start process").cause(e);
    123130                }
    124                 super.joinableStart();
    125131
     132                readerThread.dispatch(new RunAt<ExternalProcess>() {
     133
     134                        @Override
     135                        public void run() {
     136                                readerTask();
     137                        }
     138
     139                });
     140                Dispatching.use(readerThread, this);
    126141        }
    127142
    128143        @Override
    129144        public String toString() {
    130                 return super.toString() + "[" + Misc.returnNotNull(getCommand(), "?") + "]";
     145                return getName() + "[" + Misc.returnNotNull(getCommand(), "?") + "]";
    131146        }
    132147
     
    140155        @Override
    141156        protected void joinableInterrupt() {
    142                 super.joinableInterrupt();
    143                 finish();
     157                process.destroy();
     158                Dispatching.drop(readerThread, this);
     159                // finish();
    144160        }
    145161
     162        @Override
     163        @ParamAnnotation
     164        public String getName() {
     165                return readerThread.getName();
     166        }
     167
     168        /**
     169         * @param name the name to set
     170         */
     171        @ParamAnnotation
     172        public void setName(String name) {
     173                readerThread.setName(name);
     174        }
     175
     176        @Override
     177        protected void joinableFinish() {
     178
     179        }
     180
     181        @Override
     182        protected void joinableJoin() throws InterruptedException {
     183                Dispatching.join(readerThread);
     184        }
     185
     186        @Override
     187        public void childChangedState(Joinable joinable, JoinableState state) {
     188                proceedToState(state);
     189        }
     190
     191
     192
    146193}
Note: See TracChangeset for help on using the changeset viewer.