Changeset 88 for java


Ignore:
Timestamp:
06/30/13 12:48:20 (11 years ago)
Author:
psniegowski
Message:

HIGHLIGHTS:

  • loading f0 schema with XmlLoader?
  • use XmlLoader? to load configuration
  • introduce unified fork-join model of various entities

(Instances, Connections, GUI Frames, etc.),
all those entities clean up gracefully on
shutdown, which may be initialized by user
or by some entity

  • basing on above, simplify several organizing classes

(Observer, main class)

(to host native frams server process from Java level)

CHANGELOG:
Remove redundant Observer class.

Clean up in AbstractJoinable?.

Update ExternalProcess? class to changes in joining model.

Another sweep through code with FindBugs?.

Find bug with not joining RemoteInstance?.

Joining almost works.

Much improved joining model.

More improvement to joining model.

Add logging messages around joinable operations.

Rename methods in AbstractJoinable?.

Improve Joinable.

Rewrite of entity structure.

More simplifications with entities.

Further improve joinables.

Let Frame compose from JFrame instead of inheriting.

Add join classes.

Improvements of closing.

Add Builder interface.

Add FramsServerTest?.xml

FramsServer? may be configured through xml.

Make Framsticks main class an Observer of Entities.

Make Observer a generic type.

Remove variables regarding to removed endpoint.

Simplify observer (remove endpoints).

More changes to Observer and Endpoint.

Minor improvements.

Add OutputListener? to ExternalProcess?.

Improve testing of ExternalProcess?.

Add ExternalProcess? runner.

Rename the Program class to Framsticks.

Migrate Program to use XmlLoader? configuration.

First steps with configuration using XmlLoader?.

Fix several bugs.

Move all f0 classes to apriopriate package.

XmlLoader? is able to load Schema.

XmlLoader? is loading classes and props.

Add GroupBuilder?.

Location:
java/main
Files:
30 added
12 deleted
52 edited

Legend:

Unmodified
Added
Removed
  • java/main/pom.xml

    r87 r88  
    4040                        <scope>compile</scope>
    4141                </dependency>
    42                 <dependency>
    43                         <groupId>commons-configuration</groupId>
    44                         <artifactId>commons-configuration</artifactId>
    45                         <version>1.9</version>
    46                         <scope>compile</scope>
    47                 </dependency>
     42                <!-- <dependency> -->
     43                <!--    <groupId>commons-configuration</groupId> -->
     44                <!--    <artifactId>commons-configuration</artifactId> -->
     45                <!--    <version>1.9</version> -->
     46                <!--    <scope>compile</scope> -->
     47                <!-- </dependency> -->
    4848                <dependency>
    4949                        <groupId>commons-collections</groupId>
     
    152152                                                <argument>-classpath</argument>
    153153                                                <classpath />
    154                                                 <argument>com.framsticks.core.Program</argument>
     154                                                <argument>com.framsticks.core.Framsticks</argument>
    155155                                        </arguments>
    156156                                </configuration>
  • java/main/src/main/java/com/framsticks/communication/ClientConnection.java

    r85 r88  
    3232        protected final Map<String, Subscription<?>> subscriptions = new HashMap<>();
    3333
    34         public String getAddress() {
    35                 return address;
    36         }
    37 
    38         public void connect(StateFunctor connectedFunctor) {
     34        /**
     35         * @param connectedFunctor the connectedFunctor to set
     36         */
     37        public void setConnectedFunctor(StateFunctor connectedFunctor) {
     38                this.connectedFunctor = connectedFunctor;
     39        }
     40
     41
     42        protected StateFunctor connectedFunctor;
     43
     44        @Override
     45        protected void joinableStart() {
    3946                try {
    4047                        log.info("connecting to " + address);
     
    4653                        log.info("connected to " + hostName + ":" + port);
    4754                        connected = true;
    48 
    4955                        runThreads();
    5056
     
    5662                        log.error("buffer creation failure");
    5763                        connectedFunctor.call(e);
    58                         close();
    59                 }
    60         }
     64                        // close();
     65                }
     66        }
     67
    6168
    6269        private static abstract class InboundMessage {
     
    149156
    150157
    151         protected final String address;
    152158        protected final String hostName;
    153159        protected final int port;
     
    156162
    157163        public ClientConnection(String address) {
    158                 assert address != null;
    159                 this.address = address;
     164                super(address);
    160165                Matcher matcher = addressPattern.matcher(address);
    161166                if (!matcher.matches()) {
     
    235240        @Override
    236241        public String toString() {
    237                 return address;
     242                return "client connection " + address;
    238243        }
    239244
     
    328333        private int nextQueryId = 0;
    329334
    330         protected void processMessage(InboundMessage inboundMessage) throws Exception {
     335        protected void processMessage(InboundMessage inboundMessage) {
    331336                if (inboundMessage == null) {
    332337                        log.error("failed to use any inbound message");
     
    342347        }
    343348
    344         protected void processEvent(String rest) throws Exception {
     349        protected void processEvent(String rest) {
    345350                Matcher matcher = eventPattern.matcher(rest);
    346351                if (!matcher.matches()) {
     
    359364
    360365
    361         protected void processMessageStartingWith(String line) throws Exception {
     366        protected void processMessageStartingWith(String line) {
    362367                Pair<String, String> command = Strings.splitIntoPair(line, ' ', "\n");
    363368                if (command.first.equals("event")) {
     
    384389
    385390        @Override
    386         protected void receiverThreadRoutine() throws Exception {
     391        protected void receiverThreadRoutine() {
    387392                while (connected) {
    388                         processMessageStartingWith(getLine());
    389                 }
    390         }
     393                        try {
     394                                processMessageStartingWith(getLine());
     395                        } catch (Exception e) {
     396                                break;
     397                        }
     398                }
     399        }
     400
    391401
    392402}
  • java/main/src/main/java/com/framsticks/communication/Connection.java

    r85 r88  
    11package com.framsticks.communication;
    22
     3import com.framsticks.util.FramsticksException;
    34import com.framsticks.util.io.Encoding;
    45import com.framsticks.util.lang.Pair;
     
    1415import java.util.regex.Pattern;
    1516
     17import com.framsticks.util.dispatching.AbstractJoinable;
     18import com.framsticks.util.dispatching.Dispatching;
     19import com.framsticks.util.dispatching.Joinable;
     20import com.framsticks.util.dispatching.JoinableCollection;
     21import com.framsticks.util.dispatching.JoinableParent;
     22import com.framsticks.util.dispatching.JoinableState;
    1623import com.framsticks.util.dispatching.RunAt;
    1724import com.framsticks.util.dispatching.Thread;
    1825
    19 public abstract class Connection {
     26public abstract class Connection extends AbstractJoinable implements JoinableParent {
    2027
    2128        protected final static Logger log = Logger.getLogger(Connection.class);
     
    3239        protected int protocolVersion = -1;
    3340
     41        public String getAddress() {
     42                return address;
     43        }
     44        protected final String address;
     45
    3446        protected final Thread<Connection> senderThread = new Thread<>();
    3547        protected final Thread<Connection> receiverThread = new Thread<>();
    36 
     48        protected final JoinableCollection<Thread<Connection>> threads = new JoinableCollection<>(true);
     49
     50        /**
     51         *
     52         */
     53        public Connection(String address) {
     54                this.address = address;
     55                threads.add(senderThread);
     56                threads.add(receiverThread);
     57        }
    3758        public boolean isConnected() {
    3859                return connected;
    3960        }
    4061
    41         public void close() {
    42                 protocolVersion = -1;
    43                 try {
    44                         connected = false;
    45 
    46                         senderThread.interrupt();
    47                         senderThread.join();
    48 
    49                         receiverThread.interrupt();
    50                         receiverThread.join();
    51 
    52                         if (output != null) {
    53                                 output.close();
    54                                 output = null;
    55                         }
    56 
    57                         if (input != null) {
    58                                 input.close();
    59                                 input = null;
    60                         }
    61 
    62 
    63                         if (socket != null) {
    64                                 socket.close();
    65                                 socket = null;
    66                         }
    67 
    68                         log.info("connection closed");
    69                 } catch (Exception e) {
    70                         log.error(e);
    71                 }
    72 
    73         }
    7462
    7563        protected static final String ARGUMENT_PATTERN_FRAGMENT = "((?:\\S+)|(?:\"[^\"]*\"))";
     
    9583        char[] readBuffer = new char[BUFFER_LENGTH];
    9684
    97         protected String getLine() throws Exception {
     85        protected String getLine() {
    9886                StringBuilder lineBuffer = new StringBuilder();
    99                 while (!Thread.interrupted()) {
    100                         while (iterator < readChars) {
    101                                 if (readBuffer[iterator] != '\n') {
     87                try {
     88                        while (!Thread.interrupted()) {
     89                                while (iterator < readChars) {
     90                                        if (readBuffer[iterator] != '\n') {
     91                                                ++iterator;
     92                                                continue;
     93                                        }
     94                                        lineBuffer.append(readBuffer, bufferStart, iterator - bufferStart + 1);
    10295                                        ++iterator;
    103                                         continue;
     96                                        bufferStart = iterator;
     97                                        return lineBuffer.toString();
    10498                                }
    105                                 lineBuffer.append(readBuffer, bufferStart, iterator - bufferStart + 1);
    106                                 ++iterator;
    107                                 bufferStart = iterator;
    108                                 return lineBuffer.toString();
    109                         }
    110                         lineBuffer.append(readBuffer, bufferStart, readChars - bufferStart);
    111 
    112                         readChars = 0;
    113                         while (readChars == 0) {
    114                                 try {
    115                                         readChars = input.read(readBuffer);
    116                                 } catch (SocketTimeoutException ignored) {
    117                                         //timeout - continue
     99                                lineBuffer.append(readBuffer, bufferStart, readChars - bufferStart);
     100
     101                                readChars = 0;
     102                                while (readChars == 0) {
     103                                        try {
     104                                                readChars = input.read(readBuffer);
     105                                        } catch (SocketTimeoutException ignored) {
     106                                                //timeout - continue
     107                                        }
    118108                                }
    119                         }
    120                         iterator = 0;
    121                         bufferStart = 0;
    122                 }
    123                 throw new InterruptedException();
    124         }
    125 
    126         protected abstract void receiverThreadRoutine() throws Exception;
     109                                iterator = 0;
     110                                bufferStart = 0;
     111                        }
     112                        throw new InterruptedException();
     113                } catch (Exception e) {
     114                        throw new FramsticksException().msg("failed to read line").cause(e);
     115                }
     116        }
     117
     118        protected abstract void receiverThreadRoutine();
     119
     120        protected void setUpThread(Thread<Connection> thread, String name) {
     121                thread.setName("connection thread " + address + " " + name);
     122        }
    127123
    128124        protected void runThreads() {
     
    132128                } catch (IOException e) {
    133129                        log.error("buffer creation failure");
    134                         close();
    135130                        return;
    136131                }
    137132
    138                 senderThread.setName(this + "-sender");
    139                 receiverThread.setName(this + "-receiver");
    140 
    141                 senderThread.start();
    142                 receiverThread.start();
     133                setUpThread(senderThread, "sender");
     134                setUpThread(receiverThread, "receiver");
     135                Dispatching.use(threads, this);
    143136
    144137                receiverThread.invokeLater(new RunAt<Connection>() {
    145138                        @Override
    146139                        public void run() {
    147                                 try {
    148                                         receiverThreadRoutine();
    149                                 } catch (InterruptedException ignored) {
    150                                         log.debug("receiver thread interrupted");
    151                                 } catch (Exception e) {
    152                                         log.error("error: " + e);
    153                                         close();
    154                                 }
     140                                receiverThreadRoutine();
    155141                        }
    156142                });
    157143
    158144        }
    159 
    160145
    161146        /**
     
    164149         * @return Query associated with query getId.
    165150         */
    166 
    167151        public int getProtocolVersion() {
    168152                return protocolVersion;
    169153        }
    170154
    171 
     155        @Override
     156        protected void joinableInterrupt() {
     157                protocolVersion = -1;
     158
     159                connected = false;
     160                Dispatching.drop(threads, this);
     161
     162                // finish();
     163        }
     164
     165        @Override
     166        protected void joinableFinish() {
     167                try {
     168                        if (output != null) {
     169                                output.close();
     170                                output = null;
     171                        }
     172
     173                        if (input != null) {
     174                                input.close();
     175                                input = null;
     176                        }
     177
     178
     179                        if (socket != null) {
     180                                socket.close();
     181                                socket = null;
     182                        }
     183                } catch (Exception e) {
     184                        log.error("failed to stop connection: ", e);
     185                }
     186                log.debug("connection closed");
     187        }
     188
     189        @Override
     190        public void childChangedState(Joinable joinable, JoinableState state) {
     191                proceedToState(state);
     192        }
     193
     194        @Override
     195        protected void joinableJoin() throws InterruptedException {
     196                Dispatching.join(threads);
     197
     198        }
    172199
    173200}
  • java/main/src/main/java/com/framsticks/communication/ServerConnection.java

    r85 r88  
    2020
    2121        public ServerConnection(Socket socket, RequestHandler requestHandler) {
     22                super("todo");
    2223                this.socket = socket;
    2324                this.requestHandler = requestHandler;
    2425                connected = true;
    2526
    26         }
    27 
    28         public void start() {
    29                 runThreads();
    3027        }
    3128
     
    3633
    3734        @Override
    38         protected void receiverThreadRoutine() throws Exception {
     35        protected void receiverThreadRoutine() {
    3936                while (connected) {
    4037                        processNextRequest();
     
    9895        }
    9996
    100         protected void processNextRequest() throws Exception {
     97        protected void processNextRequest() {
    10198                String line = getLine();
    10299                Pair<String, String> command = Strings.splitIntoPair(line, ' ', "\n");
     
    124121                });
    125122        }
     123
     124        @Override
     125        protected void joinableStart() {
     126                // TODO Auto-generated method stub
     127
     128        }
    126129}
  • java/main/src/main/java/com/framsticks/core/Entity.java

    r86 r88  
    11package com.framsticks.core;
    22
    3 import javax.annotation.OverridingMethodsMustInvokeSuper;
    43
    54import com.framsticks.params.annotations.FramsClassAnnotation;
    6 import com.framsticks.params.annotations.ParamAnnotation;
    7 import com.framsticks.util.dispatching.Thread;
    8 import com.framsticks.util.dispatching.Dispatcher;
    9 
    10 import org.apache.commons.configuration.Configuration;
    11 import org.apache.log4j.Logger;
    12 import com.framsticks.util.dispatching.RunAt;
     5import com.framsticks.util.dispatching.Joinable;
    136
    147/**
     
    169 */
    1710@FramsClassAnnotation
    18 public abstract class Entity implements Dispatcher<Entity> {
     11public interface Entity extends Joinable {
    1912
    20         private final static Logger log = Logger.getLogger(Entity.class);
     13        public String getName();
    2114
    22         @ParamAnnotation
    23         protected String name = "entity";
    24         protected EntityOwner owner;
    25         protected Dispatcher<Entity> dispatcher;
    26 
    27         public Entity() {
    28         }
    29 
    30         public final String getName() {
    31                 return name;
    32         }
    33 
    34         /**
    35          * @param name the name to set
    36          */
    37         public final void setName(String name) {
    38                 this.name = name;
    39                 if (dispatcher instanceof Thread) {
    40                         ((Thread<Entity>) dispatcher).setName(name);
    41                 }
    42         }
    43 
    44         /**
    45          * @return the owner
    46          */
    47         public EntityOwner getOwner() {
    48                 return owner;
    49         }
    50 
    51         /**
    52          * @param owner the owner to set
    53          */
    54         public void setOwner(EntityOwner owner) {
    55                 this.owner = owner;
    56         }
    57 
    58         @Override
    59         public final boolean isActive() {
    60                 return dispatcher == null || dispatcher.isActive();
    61         }
    62 
    63         @Override
    64         public final void invokeLater(RunAt<? extends Entity> runnable) {
    65                 assert dispatcher != null;
    66                 dispatcher.invokeLater(runnable);
    67         }
    68 
    69         public Dispatcher<Entity> createDefaultDispatcher() {
    70                 return new Thread<Entity>(name).start();
    71         }
    72 
    73         @OverridingMethodsMustInvokeSuper
    74         protected void run() {
    75                 assert isActive();
    76                 log.info("running: " + this);
    77         }
     15        // /**
     16        //  * @param name the name to set
     17        //  */
     18        // @ParamAnnotation
     19        // public final void setName(String name) {
     20        //      this.name = name;
     21        //      if (dispatcher instanceof Thread) {
     22        //              ((Thread<Entity>) dispatcher).setName(name);
     23        //      }
     24        // }
    7825
    7926
    80         public void configure(Configuration config) {
    81         }
     27        // public Dispatcher<Entity> createDefaultDispatcher() {
     28        //      return new Thread<Entity>().setName(name).start();
     29        // }
    8230
    83         public Dispatcher<Entity> getDispatcher() {
    84                 return dispatcher;
    85         }
    86 
    87         /**
    88          * @param dispatcher the dispatcher to set
    89          */
    90         public void setDispatcher(Dispatcher<Entity> dispatcher) {
    91                 this.dispatcher = dispatcher;
    92         }
    93 
    94         public final void start() {
    95                 if (dispatcher == null) {
    96                         log.debug("no dispatcher set for " + this + ", creating default one");
    97                         setDispatcher(createDefaultDispatcher());
    98                 }
    99                 invokeLater(new RunAt<Entity>() {
    100                         @Override
    101                         public void run() {
    102                                 Entity.this.run();
    103                         }
    104                 });
    105         }
    106 
    107         public final void done() {
    108                 log.info("stopping entity");
    109                 if (owner != null) {
    110                         owner.onDone();
    111                 }
    112         }
    113 
     31        // public void start() {
     32        //      if (dispatcher == null) {
     33        //              log.debug("no dispatcher set for " + this + ", creating default one");
     34        //              dispatcher = createDefaultDispatcher();
     35        //      }
     36        //      invokeLater(new RunAt<Entity>() {
     37        //              @Override
     38        //              public void run() {
     39        //                      Entity.this.run();
     40        //              }
     41        //      });
     42        // }
    11443}
  • java/main/src/main/java/com/framsticks/core/Instance.java

    r87 r88  
    11package com.framsticks.core;
    22
    3 import com.framsticks.communication.*;
    4 import com.framsticks.params.*;
     3import java.util.HashSet;
     4import java.util.Iterator;
     5import java.util.LinkedList;
     6import java.util.List;
     7import java.util.Set;
     8
     9import javax.annotation.Nonnull;
     10import javax.annotation.OverridingMethodsMustInvokeSuper;
     11
     12import org.apache.log4j.Logger;
     13
     14import com.framsticks.communication.File;
     15import com.framsticks.params.AccessInterface;
     16import com.framsticks.params.ConstructionException;
     17import com.framsticks.params.FramsClass;
     18import com.framsticks.params.ListAccess;
     19import com.framsticks.params.Param;
     20import com.framsticks.params.Registry;
     21import com.framsticks.params.ValueParam;
     22import com.framsticks.params.annotations.FramsClassAnnotation;
    523import com.framsticks.params.types.ObjectParam;
    624import com.framsticks.parsers.Loaders;
    725import com.framsticks.parsers.MultiParamLoader;
    8 import com.framsticks.util.*;
     26import com.framsticks.util.StateFunctor;
    927import com.framsticks.util.UnsupportedOperationException;
    1028import com.framsticks.util.dispatching.Dispatching;
    1129import com.framsticks.util.dispatching.Future;
     30import com.framsticks.util.dispatching.RunAt;
     31import com.framsticks.util.dispatching.Thread;
    1232import com.framsticks.util.lang.Casting;
    13 import org.apache.log4j.Logger;
    14 import com.framsticks.util.dispatching.RunAt;
    15 
    16 import java.util.*;
    1733
    1834/**
    1935 * @author Piotr Sniegowski
    2036 */
    21 public abstract class Instance extends Entity {
     37@FramsClassAnnotation
     38public abstract class Instance extends Thread<Instance> implements Entity {
    2239
    2340        private static final Logger log = Logger.getLogger(Instance.class.getName());
     
    2542        protected Node root;
    2643
    27         public Set<InstanceListener> listeners = new HashSet<InstanceListener>();
     44        protected Set<InstanceListener> listeners = new HashSet<InstanceListener>();
    2845
    2946        public Instance() {
    30         }
    31 
    32         @Override
    33         protected void run() {
    34                 super.run();
    35                 root = new Node(Param.build().name("Instance").id(name).type("o"), null);
    36                 com.framsticks.model.Package.register(registry);
     47                setName("entity");
    3748        }
    3849
     
    262273
    263274
    264         public FramsClass processFetchedInfo(File file) {
     275        public @Nonnull FramsClass processFetchedInfo(File file) {
    265276                assert isActive();
    266277                FramsClass framsClass = Loaders.loadFramsClass(file.getContent());
    267278                if ("/".equals(file.getPath())) {
    268279                        if (root.getParam().getContainedTypeName() == null) {
    269                                 root = new Node(Param.build().name("Instance").id(name).type("o " + framsClass.getId()), root.getObject());
     280                                root = new Node(Param.build().name("Instance").id(getName()).type("o " + framsClass.getId()), root.getObject());
    270281                        }
    271282                }
     
    346357                return getPath("/");
    347358        }
     359
     360        @Override
     361        @OverridingMethodsMustInvokeSuper
     362        protected void firstTask() {
     363                root = new Node(Param.build().name("Instance").id(getName()).type("o"), null);
     364                com.framsticks.model.Package.register(registry);
     365        }
     366
    348367}
    349368
  • java/main/src/main/java/com/framsticks/core/LocalInstance.java

    r85 r88  
    44import com.framsticks.util.dispatching.Thread;
    55
    6 import org.apache.commons.configuration.Configuration;
    76import org.apache.log4j.Logger;
    87
     
    2726        }
    2827
    29         @Override
    30         public void configure(Configuration config) {
    31                 Integer accept = config.getInteger("accept", null);
    32                 if (accept != null) {
    33                         try {
    34                                 acceptSocket = new ServerSocket();
    35                                 acceptSocket.setReuseAddress(true);
    36                                 acceptThread = new Thread<Accept>(name + "-accept").start();
    37                                 tryBind(accept);
    38                         } catch (IOException e) {
    39                                 log.fatal("failed to create accept socket: " + e);
    40                         }
    41                 }
    42         }
     28        // @Override
     29        // public void configure(Configuration config) {
     30        //      Integer accept = config.getInteger("accept", null);
     31        //      if (accept != null) {
     32        //              try {
     33        //                      acceptSocket = new ServerSocket();
     34        //                      acceptSocket.setReuseAddress(true);
     35        //                      acceptThread = new Thread<Accept>().setName(name + "-accept").start();
     36        //                      tryBind(accept);
     37        //              } catch (IOException e) {
     38        //                      log.fatal("failed to create accept socket: " + e);
     39        //              }
     40        //      }
     41        // }
    4342
    4443        protected final Set<InstanceClient> clients = new HashSet<InstanceClient>();
  • java/main/src/main/java/com/framsticks/diagnostics/Diagnostics.java

    r84 r88  
    11package com.framsticks.diagnostics;
    22
    3 import org.apache.commons.configuration.Configuration;
    43
    5 import com.framsticks.observers.Endpoint;
    6 import com.framsticks.observers.Observer;
     4import java.util.Date;
     5import java.io.File;
     6import java.io.FileOutputStream;
     7import java.io.IOException;
     8import java.io.OutputStreamWriter;
     9import java.io.PrintWriter;
     10import java.text.SimpleDateFormat;
     11
     12import org.apache.log4j.Logger;
     13
     14import com.framsticks.core.AbstractInstanceListener;
     15import com.framsticks.core.Instance;
     16import com.framsticks.dumping.PrintWriterSink;
     17import com.framsticks.dumping.SaveStream;
     18import com.framsticks.params.annotations.AutoAppendAnnotation;
     19import com.framsticks.remote.RecursiveFetcher;
     20import com.framsticks.util.Logging;
     21import com.framsticks.util.PeriodicTask;
     22import com.framsticks.util.StateFunctor;
     23import com.framsticks.util.dispatching.JoinableCollection;
     24import com.framsticks.util.io.Encoding;
    725
    826/**
    927 * @author Piotr Sniegowski
    1028 */
    11 public class Diagnostics extends Observer {
     29public class Diagnostics extends JoinableCollection<Instance> {
     30        private static final Logger log =
     31                Logger.getLogger(Diagnostics.class);
     32
    1233
    1334        Integer dumpsInterval;
     
    1940        }
    2041
     42
    2143        @Override
    22         public void configure(Configuration config) {
    23                 super.configure(config);
    24                 dumpsInterval = config.getInteger("dumps.interval", null);
    25                 dumpsPath = config.getString("dumps.path", null);
    26                 dumpsFormat = config.getString("dumps.format", null);
     44        @AutoAppendAnnotation
     45        public void add(final Instance instance) {
     46                super.add(instance);
     47
     48                instance.addListener(new AbstractInstanceListener() {
     49                        @Override
     50                        public void onRun(Exception e) {
     51                                if (e != null) {
     52                                        return;
     53                                }
     54
     55                                if (dumpsInterval != null) {
     56                                        new PeriodicTask<Instance>(instance, dumpsInterval * 1000) {
     57                                                @Override
     58                                                public void run() {
     59
     60                                                        log.info("starting periodic dump");
     61                                                        new RecursiveFetcher(instance, instance.getRootPath(), new StateFunctor() {
     62                                                                @Override
     63                                                                public void call(Exception e) {
     64                                                                        if (Logging.log(log, "recursively fetch", instance, e)) {
     65                                                                                again();
     66                                                                                return;
     67                                                                        }
     68                                                                        log.info("instance resolved, saving");
     69                                                                        try {
     70                                                                                final String fileName = dumpsPath + "/" + instance + "_" + new SimpleDateFormat(dumpsFormat).format(new Date()) + ".param";
     71                                                                                File file = new File(fileName);
     72                                                                                new SaveStream(new PrintWriterSink(new PrintWriter(new OutputStreamWriter(new FileOutputStream(file), Encoding.getFramsticksCharset()))), instance, instance.getRootPath(), new StateFunctor() {
     73                                                                                        @Override
     74                                                                                        public void call(Exception e) {
     75                                                                                                Logging.log(log, "periodic dump in " + fileName + " of", instance, e);
     76                                                                                                again();
     77                                                                                        }
     78                                                                                });
     79                                                                        } catch (IOException ex) {
     80                                                                                log.info("failed to initiate dump: " + ex);
     81                                                                                again();
     82                                                                        }
     83
     84                                                                }
     85                                                        });
     86                                                }
     87                                        };
     88                                }
     89                        }
     90                });
     91
     92
     93
    2794        }
    2895
    29 
    30         @Override
    31         protected Endpoint createEndpoint() {
    32                 return new DiagnosticsEndpoint();
    33         }
    34 
     96        // @Override
     97        // public void configure(Configuration config) {
     98        //      super.configure(config);
     99        //      dumpsInterval = config.getInteger("dumps.interval", null);
     100        //      dumpsPath = config.getString("dumps.path", null);
     101        //      dumpsFormat = config.getString("dumps.format", null);
     102        // }
    35103
    36104}
  • java/main/src/main/java/com/framsticks/dumping/FileInstance.java

    r85 r88  
    44import com.framsticks.core.Path;
    55import com.framsticks.core.Instance;
     6import com.framsticks.params.annotations.FramsClassAnnotation;
     7import com.framsticks.params.annotations.ParamAnnotation;
    68import com.framsticks.util.dispatching.Future;
    79import com.framsticks.util.io.Encoding;
    810
    9 import org.apache.commons.configuration.Configuration;
    1011import org.apache.log4j.Logger;
    1112
     
    1617import java.io.InputStreamReader;
    1718
     19import javax.annotation.OverridingMethodsMustInvokeSuper;
     20
    1821/**
    1922 * @author Piotr Sniegowski
    2023 */
     24@FramsClassAnnotation
    2125public class FileInstance extends LocalInstance {
    2226
     
    2731        }
    2832
    29         @Override
    30         public void configure(Configuration config) {
    31                 super.configure(config);
    32                 file = new File(config.getString("filename"));
     33        @ParamAnnotation
     34        public void setFilename(String filename) {
     35                file = new File(filename);
     36        }
     37
     38        @ParamAnnotation
     39        public String getFilename() {
     40                return file.getName();
    3341        }
    3442
    3543        @Override
    36         public void run() {
     44        @OverridingMethodsMustInvokeSuper
     45        protected void firstTask() {
    3746                assert isActive();
    38                 super.run();
     47                super.firstTask();
    3948                try {
    4049                        LoadStream stream = new LoadStream(this.getRootPath(), new BufferedReader(new InputStreamReader(new FileInputStream(file), Encoding.getFramsticksCharset())), this, new Future<Path>() {
  • java/main/src/main/java/com/framsticks/examples/GenotypeBrowser.java

    r87 r88  
    22
    33import com.framsticks.core.Instance;
    4 import com.framsticks.core.Node;
    54import com.framsticks.dumping.PrintWriterSink;
    65import com.framsticks.model.*;
    7 import com.framsticks.model.Package;
     6import com.framsticks.model.f0.Schema;
    87import com.framsticks.params.*;
    98import com.framsticks.parsers.F0Parser;
    109import com.framsticks.parsers.F0Writer;
    11 import com.framsticks.parsers.Schema;
    1210
    13 import org.apache.commons.configuration.Configuration;
    1411import org.apache.log4j.Logger;
    1512
     
    1714import java.io.StringWriter;
    1815import java.util.List;
     16
     17import javax.annotation.OverridingMethodsMustInvokeSuper;
    1918
    2019/**
     
    3130        }
    3231
    33         @Override
    34         public void configure(Configuration config) {
    35                 super.configure(config);
    36                 try {
    37                         schema = new Schema(Schema.getDefaultDefinitionAsStream());
    38                 } catch (Exception e) {
    39                         log.error("failed to load schema: " + e);
    40                 }
    41                 this.registry = schema.getRegistry();
    42                 Package.register(this.getRegistry());
     32        // @Override
     33        // public void configure(Configuration config) {
     34        //      super.configure(config);
     35        //      try {
     36        //              schema = Schema.load(Schema.getDefaultDefinitionAsStream());
     37        //      } catch (Exception e) {
     38        //              log.error("failed to load schema: " + e);
     39        //      }
     40        //      this.registry = schema.getRegistry();
     41        //      Package.register(this.getRegistry());
    4342
    44                 registry.putInfoIntoCache(FramsClass.build()
    45                                 .idAndName("ModelBuilderRoot")
    46                                 .param(Param.build().id("model").type("o Model").name("model"))
    47                                 .param(Param.build().id("genotype").type("s 1").name("genotype"))
    48                                 .finish()
    49                 );
    50                 root = new Node(Param.build().type("o ModelBuilderRoot").id(name).name("Instance"), PropertiesAccess.createPropertiesMap());
    51         }
     43        //      registry.putInfoIntoCache(FramsClass.build()
     44        //                      .idAndName("ModelBuilderRoot")
     45        //                      .param(Param.build().id("model").type("o Model").name("model"))
     46        //                      .param(Param.build().id("genotype").type("s 1").name("genotype"))
     47        //                      .finish()
     48        //      );
     49        //      root = new Node(Param.build().type("o ModelBuilderRoot").id(name).name("Instance"), PropertiesAccess.createPropertiesMap());
     50        // }
    5251
    5352        @Override
    54         protected void run() {
     53        @OverridingMethodsMustInvokeSuper
     54        protected void firstTask() {
    5555                assert isActive();
     56                super.firstTask();
    5657
    5758                try {
  • java/main/src/main/java/com/framsticks/gui/Browser.java

    r85 r88  
    22
    33import com.framsticks.core.*;
    4 import com.framsticks.observers.Endpoint;
    5 import com.framsticks.observers.Observer;
     4import com.framsticks.params.annotations.AutoAppendAnnotation;
     5import com.framsticks.params.annotations.FramsClassAnnotation;
     6import com.framsticks.params.annotations.ParamAnnotation;
    67import com.framsticks.util.Logging;
     8import com.framsticks.util.dispatching.AbstractJoinable;
    79import com.framsticks.util.dispatching.Dispatcher;
     10import com.framsticks.util.dispatching.Dispatching;
    811import com.framsticks.util.dispatching.Future;
    9 
    10 import org.apache.commons.configuration.Configuration;
    11 import org.apache.commons.lang.ArrayUtils;
     12import com.framsticks.util.dispatching.Joinable;
     13import com.framsticks.util.dispatching.JoinableCollection;
     14import com.framsticks.util.dispatching.JoinableParent;
     15import com.framsticks.util.dispatching.JoinableState;
     16
     17import javax.swing.*;
     18
    1219import org.apache.log4j.Logger;
    13 
    14 import javax.swing.*;
    1520
    1621import java.awt.Dimension;
    1722import java.util.ArrayList;
    18 import java.util.HashSet;
    1923import java.util.List;
    20 import java.util.Set;
     24import java.util.Map;
    2125import com.framsticks.util.dispatching.RunAt;
    2226
     
    2428 * @author Piotr Sniegowski
    2529 */
    26 public class Browser extends Observer {
     30@FramsClassAnnotation
     31public class Browser extends AbstractJoinable implements Dispatcher<Browser>, Entity, JoinableParent {
    2732
    2833        private static final Logger log = Logger.getLogger(Browser.class.getName());
    2934
    30         protected final Set<Frame> frames = new HashSet<Frame>();
     35        protected JoinableCollection<Frame> frames = new JoinableCollection<Frame>().setObservableName("frames");
     36        protected JoinableCollection<Instance> instances = new JoinableCollection<Instance>().setObservableName("instances");
     37
    3138        protected MainFrame mainFrame;
    3239        public List<PanelProvider> panelProviders = new ArrayList<PanelProvider>();
    3340        protected Dimension defaultFrameDimension;
    3441
     42        String name;
     43
    3544        public void addFrame(Frame frame) {
    3645                frames.add(frame);
     
    3847
    3948        public Browser() {
     49                setName("browser");
    4050                JPopupMenu.setDefaultLightWeightPopupEnabled(false);
    4151                addPanelProvider(new StandardPanelProvider());
    42         }
    43 
    44         @Override
    45         public void configure(Configuration config) {
    46                 super.configure(config);
    47 
    48                 defaultFrameDimension = new Dimension(config.getInteger("size.width", 1000), config.getInteger("size.height", 500));
    49 
    50                 for (String name : config.getStringArray("panel_providers")) {
    51                         try {
    52                                 Class<?> c = Class.forName(name);
    53                                 if (ArrayUtils.indexOf(c.getInterfaces(), PanelProvider.class) == -1) {
    54                                         continue;
    55                                 }
    56                                 PanelProvider p = (PanelProvider)c.newInstance();
    57                                 addPanelProvider(p);
    58                         } catch (Exception e) {
    59                                 log.error("failed to load PanelProvider " + name + ": " + e);
    60                         }
    61                 }
    62 
    63                 // for (final String path : config.getStringArray("resolve_paths")) {
    64                 //      invokeLater()
    65                 //      autoResolvePath(path, new Future<Path>() {
    66                 //              @Override
    67                 //              public void result(Path p, Exception e) {
    68                 //                      Logging.log(log, "auto resolve path", path, e);
    69                 //              }
    70                 //      });
    71                 // }
    72         }
    73 
     52
     53                mainFrame = new MainFrame(Browser.this);
     54                addFrame(mainFrame);
     55        }
     56
     57        @AutoAppendAnnotation
    7458        public void addPanelProvider(PanelProvider panelProvider) {
    7559                log.debug("added panel provider of type: " + panelProvider.getClass().getCanonicalName());
     
    7761        }
    7862
     63        @AutoAppendAnnotation
     64        public void addInstance(Instance instance) {
     65                log.info("adding instance: " + instance);
     66                instances.add(instance);
     67        }
     68
    7969        public void autoResolvePath(final String path, final Future<Path> future) {
    80                 final Instance i = endpoints.get("localhost").getInstance();
     70                final Instance i = instances.get("localhost");
    8171                i.invokeLater(new RunAt<Instance>() {
    8272                        @Override
     
    110100        }
    111101
    112         @Override
    113         public void run() {
    114                 super.run();
    115 
     102        protected void firstTask() {
    116103                assert isActive();
     104                log.info("executing first task");
    117105
    118106                try {
     
    135123                javax.swing.JFrame.setDefaultLookAndFeelDecorated(true);
    136124
    137                 mainFrame = new MainFrame(Browser.this);
    138                 addFrame(mainFrame);
    139125
    140126                for (Frame f : frames) {
     
    142128                }
    143129
    144                 for (final Endpoint e : getEndpoints().values()) {
    145                         e.invokeLater(new RunAt<Instance>() {
     130                for (final Instance i : instances) {
     131                        i.invokeLater(new RunAt<Instance>() {
    146132                                @Override
    147133                                public void run() {
    148                                         final Path p = e.getInstance().getRootPath();
     134                                        final Path p = i.getRootPath();
    149135                                        invokeLater(new RunAt<Browser>() {
    150136                                                @Override
    151137                                                public void run() {
    152                                                         mainFrame.addRootPath((BrowserEndpoint) e, p);
     138                                                        mainFrame.addRootPath(p);
    153139                                                }
    154140                                        });
     
    158144
    159145                for (Frame f : frames) {
    160                         f.setVisible(true);
     146                        f.getSwing().setVisible(true);
    161147                }
    162148
     
    169155                //assert instance.isActive();
    170156
    171 
    172 /*
    173                 final TreeNode parentTreeNode = (TreeNode) child.getParent().getUserObject();
    174                 if (parentTreeNode == null) {
    175                         Dispatching.invokeDispatch(this, manager, new Runnable() {
    176                                 @Override
    177                                 public void run() {
    178                                         createTreeNodeForChild(child);
    179                                 }
    180                         });
    181                         return;
    182                 }
    183                 log.debug(child.getClass().getSimpleName() + " created: " + child);
    184 
    185 
    186                 invokeLater(new Runnable() {
     157                /*
     158                 final TreeNode parentTreeNode = (TreeNode) child.getParent().getUserObject();
     159                 if (parentTreeNode == null) {
     160                 Dispatching.invokeDispatch(this, manager, new Runnable() {
     161                 @Override
     162                 public void run() {
     163                 createTreeNodeForChild(child);
     164                 }
     165                 });
     166                 return;
     167                 }
     168                 log.debug(child.getClass().getSimpleName() + " created: " + child);
     169
     170
     171                 invokeLater(new Runnable() {
     172                 @Override
     173                 public void run() {
     174                 parentTreeNode.getOrCreateChildTreeNodeFor(child);
     175                 }
     176                 });
     177                 */
     178        }
     179
     180        @Override
     181        protected void joinableStart() {
     182                Dispatching.use(frames, this);
     183                Dispatching.use(instances, this);
     184
     185                invokeLater(new RunAt<Browser>() {
    187186                        @Override
    188187                        public void run() {
    189                                 parentTreeNode.getOrCreateChildTreeNodeFor(child);
     188                                firstTask();
    190189                        }
    191190                });
    192 */
    193         }
    194 
    195 
    196         @Override
    197         protected Endpoint createEndpoint() {
    198                 return new BrowserEndpoint();
    199         }
    200 
    201         @Override
    202         public Dispatcher<Entity> createDefaultDispatcher() {
    203                 return SwingDispatcher.getInstance();
     191        }
     192
     193        /**
     194         * @return the instances
     195         */
     196        public Map<String, Instance> getInstances() {
     197                return instances.getObservables();
    204198        }
    205199
     
    211205        }
    212206
     207        /**
     208         * @return the name
     209         */
     210        @ParamAnnotation
     211        public String getName() {
     212                return name;
     213        }
     214
     215        /**
     216         * @param name the name to set
     217         */
     218        @ParamAnnotation
     219        public void setName(String name) {
     220                this.name = name;
     221        }
     222
     223        @Override
     224        public boolean isActive() {
     225                return SwingDispatcher.getInstance().isActive();
     226        }
     227
     228        @Override
     229        public void invokeLater(RunAt<? extends Browser> runnable) {
     230                SwingDispatcher.getInstance().invokeLater(runnable);
     231        }
     232
     233        @Override
     234        protected void joinableJoin() throws InterruptedException {
     235                Dispatching.join(frames);
     236                Dispatching.join(instances);
     237                // super.join();
     238        }
     239
     240        @Override
     241        protected void joinableInterrupt() {
     242                Dispatching.drop(frames, this);
     243                Dispatching.drop(instances, this);
     244        }
     245
     246        @Override
     247        public void childChangedState(Joinable joinable, JoinableState state) {
     248                if (joinable == frames) {
     249                        proceedToState(state);
     250                }
     251
     252        }
     253
     254        @Override
     255        protected void joinableFinish() {
     256                // TODO Auto-generated method stub
     257
     258        }
     259
     260        @Override
     261        public String toString() {
     262                return getName();
     263        }
     264
     265
     266        // @Override
     267        // public boolean isDone() {
     268        //      return frames.isDone() && instances.isDone();
     269        // }
    213270}
  • java/main/src/main/java/com/framsticks/gui/Frame.java

    r85 r88  
    11package com.framsticks.gui;
    22
     3import com.framsticks.core.Entity;
    34import com.framsticks.core.Instance;
    45import com.framsticks.core.Path;
     
    67import com.framsticks.gui.view.TreeCellRenderer;
    78import com.framsticks.util.dispatching.Dispatcher;
     9import com.framsticks.util.dispatching.JoinableCollection;
    810import com.framsticks.util.lang.ScopeEnd;
    911import com.framsticks.util.swing.KeyboardModifier;
     12import com.framsticks.util.swing.MenuConstructor;
     13
    1014import org.apache.log4j.Logger;
    1115
     
    2832 */
    2933@SuppressWarnings("serial")
    30 public class Frame extends JFrame implements Dispatcher<Frame> {
     34public class Frame extends JoinableCollection<Instance> implements Entity, Dispatcher<Frame> {
    3135
    3236        private static final Logger log = Logger.getLogger(Frame.class.getName());
     
    3438        protected final Browser browser;
    3539
    36         protected final Dimension screenDimension = Toolkit.getDefaultToolkit()
    37                         .getScreenSize();
    38 
    39         final protected CardLayout cardPanelLayout = new CardLayout();
    40         protected final JPanel cardPanel = new JPanel();
    41 
     40        protected final Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
     41
     42        protected CardLayout cardPanelLayout;
     43        protected JPanel cardPanel;
     44
     45        protected final String title;
     46        protected JFrame swing;
    4247        protected JScrollPane treeScrollPane;
    4348        protected JTree tree;
     
    6368        protected JMenu helpMenu;
    6469
    65         protected final Map<BrowserEndpoint, EndpointAtFrame> endpoints = new HashMap<BrowserEndpoint, EndpointAtFrame>();
    66         protected final Map<Instance, EndpointAtFrame> endpointsByInstance = new HashMap<Instance, EndpointAtFrame>();
     70        protected final Map<Instance, InstanceAtFrame> instancesAtFrames = new HashMap<Instance, InstanceAtFrame>();
    6771
    6872        public Frame(String title, Browser browser) {
    69                 super(title);
     73                this.title = title;
     74                this.browser = browser;
     75        }
     76
     77        public void configure() {
     78                swing = new JFrame(title);
     79                swing.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
     80                swing.addWindowListener(new WindowAdapter() {
     81                        @Override
     82                        public void windowClosing(WindowEvent e) {
     83                                log.info("received closing");
     84                                joinableFinish();
     85                        }
     86                });
    7087                /** this is done to remove the current value label from above the slider,
    7188                 * because it cannot put to work properly with floating-point value sliders,
    7289                 * nor it can be removed in normal way through JSlider methods  */
    7390                UIManager.put("Slider.paintValue", false);
    74                 this.browser = browser;
    7591                log.debug("creating " + this);
    76         }
    77 
    78         public void configure() {
    79 
    80                 Container contentPane = this.getContentPane();
     92
     93                statusBar = new JLabel("not connected");
     94
     95                Container contentPane = swing.getContentPane();
    8196                contentPane.setLayout(new BorderLayout());
    8297
     
    95110                treePopupMenu.add(new JMenuItem("Refresh"));
    96111                treePopupMenu.add(new JMenuItem("Open in new frame as root"));
    97                 addNodeActionToTreePopupMenu("Copy path to clipboard",
    98                                 new NodeAction() {
    99                                         @Override
    100                                         public void actionPerformed(TreeNode treeNode) {
    101                                                 Path path = treeNode.getInstancePath();
    102                                                 StringSelection selection = new StringSelection(path
    103                                                                 .toString());
    104                                                 getToolkit().getSystemClipboard().setContents(
    105                                                                 selection, selection);
    106                                         }
    107                                 });
     112                addNodeActionToTreePopupMenu("Copy path to clipboard", new NodeAction() {
     113                        @Override
     114                        public void actionPerformed(TreeNode treeNode) {
     115                                Path path = treeNode.getInstancePath();
     116                                StringSelection selection = new StringSelection(path.toString());
     117                                swing.getToolkit().getSystemClipboard().setContents(selection, selection);
     118                        }
     119                });
    108120                //this.add(createMenuItem("Add to favourites", null));
    109121                //this.add(createMenuItem("Remove from favourites", null));
     
    171183                });
    172184
    173                 new KeyboardModifier(tree, JComponent.WHEN_FOCUSED)
    174                         .join(KeyStroke.getKeyStroke('h'), KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0))
    175                         .join(KeyStroke.getKeyStroke('j'), KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0))
    176                         .join(KeyStroke.getKeyStroke('k'), KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0))
    177                         .join(KeyStroke.getKeyStroke('l'), KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0))
    178                         ;
     185                new KeyboardModifier(tree, JComponent.WHEN_FOCUSED).join(KeyStroke.getKeyStroke('h'), KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0)).join(KeyStroke.getKeyStroke('j'), KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0)).join(KeyStroke.getKeyStroke('k'), KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0)).join(KeyStroke.getKeyStroke('l'), KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0));
    179186
    180187                tree.setCellRenderer(new TreeCellRenderer());
     
    214221                leftPanel.setLayout(new BorderLayout());
    215222                //leftPanel.add(new ViewerTest(), BorderLayout.PAGE_START);
    216 //        JPanel leftTopPanel = createLeftTopPanel();
    217 //        if (leftTopPanel != null) {
    218 //            leftPanel.add(leftTopPanel, BorderLayout.PAGE_START);
    219 //        }
     223                //        JPanel leftTopPanel = createLeftTopPanel();
     224                //        if (leftTopPanel != null) {
     225                //            leftPanel.add(leftTopPanel, BorderLayout.PAGE_START);
     226                //        }
    220227                leftPanel.add(treePanel, BorderLayout.CENTER);
    221228                leftPanel.setBackground(Color.WHITE);
    222229                leftPanel.setForeground(Color.WHITE);
    223230
     231                cardPanel = new JPanel();
    224232                cardPanel.setName("card");
    225233                JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, cardPanel);
     
    236244                mainPanelLayout.show(mainPanel, "browser");
    237245
     246                cardPanelLayout = new CardLayout();
    238247                cardPanel.setLayout(cardPanelLayout);
    239248
    240                 this.pack();
     249                swing.pack();
    241250                tree.requestFocusInWindow();
    242251
    243                 log.debug("frame configured");
     252                log.debug("frame configured: " + this);
     253
     254                new MenuConstructor(fileMenu).add(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK), new AbstractAction("Close") {
     255                        @Override
     256                        public void actionPerformed(ActionEvent actionEvent) {
     257                                interrupt();
     258                        }
     259                });
    244260
    245261        }
     
    249265        }
    250266
    251         public void addRootPath(BrowserEndpoint endpoint, Path path) {
    252                 assert isActive();
    253                 assert !endpoints.containsKey(endpoint);
    254 
    255                 EndpointAtFrame e = new EndpointAtFrame(endpoint, this);
    256                 endpoint.getInstance().addListener(e);
    257                 endpoints.put(endpoint, e);
    258                 endpointsByInstance.put(endpoint.getInstance(), e);
     267        public void addRootPath(Path path) {
     268                assert isActive();
     269                Instance instance = path.getInstance();
     270                assert browser.getInstances().containsValue(instance);
     271
     272                InstanceAtFrame e = new InstanceAtFrame(instance, this);
     273                instance.addListener(e);
     274                instancesAtFrames.put(instance, e);
    259275                TreeNode node = new TreeNode(e, path);
    260276                e.rootTreeNode = node;
     
    299315        }
    300316
    301 
    302317        private void showPopup(MouseEvent e) {
    303318                assert isActive();
     
    314329        }
    315330
     331        /**
     332         * @return the swing
     333         */
     334        public JFrame getSwing() {
     335                return swing;
     336        }
     337
    316338        public TreeNode getCurrentlyPoppedTreeNode() {
    317339                assert isActive();
    318340                return currentlyPoppedTreeNode;
    319341        }
    320 
    321342
    322343        public void clear() {
     
    342363        public void selectTreeNode(final TreeNode treeNode) {
    343364                assert isActive();
    344 /*              final Panel panel = treeNode.getOrCreatePanel();
    345                 if (panel == null) {
    346                         return;
    347                 }
    348                 panel.setCurrentTreeNode(treeNode);
    349                 treeNode.updateData();
    350                 showPanel(panel);*/
     365                /*              final Panel panel = treeNode.getOrCreatePanel();
     366                 if (panel == null) {
     367                 return;
     368                 }
     369                 panel.setCurrentTreeNode(treeNode);
     370                 treeNode.updateData();
     371                 showPanel(panel);*/
    351372        }
    352373
     
    359380                        return null;
    360381                }
    361                 return (TreeNode)treePath.getLastPathComponent();
     382                return (TreeNode) treePath.getLastPathComponent();
    362383        }
    363384
     
    373394        public void goTo(Path path) {
    374395                assert isActive();
    375                 final TreePath treePath = endpointsByInstance.get(path.getInstance()).getTreePath(path, false);
     396                final TreePath treePath = instancesAtFrames.get(path.getInstance()).getTreePath(path, false);
    376397                log.info("go to path: " + path + "(" + treePath + ")");
    377398
     
    388409        }
    389410
    390 
    391411        public void addNode(TreeNode child, DefaultMutableTreeNode parent) {
    392412                assert isActive();
     
    399419        @Override
    400420        public String toString() {
    401                 return getTitle() + "@" + browser.getName();
    402         }
     421                return title + "@" + browser.getName();
     422        }
     423
     424        @Override
     425        protected void joinableInterrupt() {
     426                assert isActive();
     427                super.joinableInterrupt();
     428
     429                invokeLater(new RunAt<Frame>() {
     430                        @Override
     431                        public void run() {
     432                                finish();
     433                        }
     434                });
     435        }
     436
     437        @Override
     438        protected void joinableFinish() {
     439                assert isActive();
     440                log.debug("disposing frame " + this);
     441                swing.dispose();
     442        }
     443
     444        // @Override
     445        // public boolean isDone() {
     446        //      return super.isDone() && !swing.isDisplayable();
     447        // }
     448
     449
     450        @Override
     451        public String getName() {
     452                return title;
     453        }
     454
    403455
    404456}
  • java/main/src/main/java/com/framsticks/gui/MainFrame.java

    r84 r88  
    2828         */
    2929        public MainFrame(final Browser browser) {
    30                 super("Framsticks Network Client", browser);
     30                super("framsticks", browser);
    3131                log.debug("creating main frame");
    3232
    33                 statusBar = new JLabel("not connected");
    3433        }
    3534
     
    234233        private void setFrameProperties() {
    235234                assert isActive();
    236                 setMinimumSize(this.getPreferredSize());
    237                 setSize(this.getPreferredSize());
    238                 setMaximumSize(screenDimension);
    239                 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    240 
    241                 setIconImage(ImageProvider.loadImage(ImageProvider.LOGO)
     235                swing.setMinimumSize(swing.getPreferredSize());
     236                swing.setSize(swing.getPreferredSize());
     237                swing.setMaximumSize(screenDimension);
     238                swing.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
     239
     240                swing.setIconImage(ImageProvider.loadImage(ImageProvider.LOGO)
    242241                                .getImage());
    243242
    244243
    245                 addWindowListener(new WindowAdapter() {
     244                swing.addWindowListener(new WindowAdapter() {
    246245                        public void windowClosing(WindowEvent e) {
    247246                                assert isActive();
     
    252251                                */
    253252                                onWindowClosing();
    254                                 dispose();
     253                                swing.dispose();
    255254                        }
    256255                });
  • java/main/src/main/java/com/framsticks/gui/MultiPanel.java

    r84 r88  
    2424                for (Panel p : panels) {
    2525                        assert p.getClassName().equals(getClassName());
    26                         assert p.getEndpointAtFrame() == getEndpointAtFrame();
     26                        assert p.getInstanceAtFrame() == getInstanceAtFrame();
    2727                        tabbedPane.add(p.getTitle(), p);
    2828                }
  • java/main/src/main/java/com/framsticks/gui/Panel.java

    r84 r88  
    1515
    1616        public static class Parameters {
    17                 public final EndpointAtFrame endpoint;
     17                public final InstanceAtFrame instanceAtFrame;
    1818                public final CompositeParam param;
    1919                public final FramsClass framsClass;
    2020
    21                 public Parameters(EndpointAtFrame endpoint, CompositeParam param, FramsClass framsClass) {
    22                         this.endpoint = endpoint;
     21                public Parameters(InstanceAtFrame instanceAtFrame, CompositeParam param, FramsClass framsClass) {
     22                        this.instanceAtFrame = instanceAtFrame;
    2323                        this.param = param;
    2424                        this.framsClass = framsClass;
     
    2929
    3030        protected TreeNode currentTreeNode;
    31         protected final EndpointAtFrame endpoint;
     31        protected final InstanceAtFrame instanceAtFrame;
    3232        protected final Frame frame;
    3333        protected final String className;
     
    3737
    3838        public Panel(Parameters parameters) {
    39                 this.endpoint = parameters.endpoint;
    40                 this.frame = parameters.endpoint.getFrame();
     39                this.instanceAtFrame = parameters.instanceAtFrame;
     40                this.frame = parameters.instanceAtFrame.getFrame();
    4141                this.framsClass = parameters.framsClass;
    4242                this.param = parameters.param;
     
    5757        }
    5858
    59         public final EndpointAtFrame getEndpointAtFrame() {
    60                 return endpoint;
     59        public final InstanceAtFrame getInstanceAtFrame() {
     60                return instanceAtFrame;
    6161        }
    6262
  • java/main/src/main/java/com/framsticks/gui/StandardPanelProvider.java

    r84 r88  
    2222                }
    2323//              if (param instanceof ListParam) {
    24 //                      return new ListPanel(endpoint);
     24//                      return new ListPanel();
    2525//              }
    2626                return null;
  • java/main/src/main/java/com/framsticks/gui/TreeNode.java

    r85 r88  
    4141
    4242        final protected Frame frame;
    43         final protected EndpointAtFrame endpoint;
     43        final protected InstanceAtFrame instanceAtFrame;
    4444
    4545        final protected Map<EventParam, Subscription<?>> userSubscriptions = new HashMap<>();
     
    5151        protected Path path;
    5252
    53         public TreeNode(EndpointAtFrame endpoint, final Path path) {
    54                 this.frame = endpoint.getFrame();
     53        public TreeNode(InstanceAtFrame instanceAtFrame, final Path path) {
     54                this.frame = instanceAtFrame.getFrame();
    5555                assert frame.isActive();
    5656                this.paramId = path.getLastElement();
     
    5858                log.debug("creating treenode " + name + ": " + path);
    5959                this.path = path;
    60                 this.endpoint = endpoint;
     60                this.instanceAtFrame = instanceAtFrame;
    6161
    6262                iconName = TreeCellRenderer.findIconName(name, path.getTextual());
     
    171171                                                }
    172172                                                log.debug("update: treenode for " + p);
    173                                                 TreeNode childNode = new TreeNode(endpoint, childPath);
     173                                                TreeNode childNode = new TreeNode(instanceAtFrame, childPath);
    174174
    175175                                                frame.addNode(childNode, TreeNode.this);
     
    336336
    337337                CompositeParam param = path.getTop().getParam();
    338                 panel = endpoint.findPanel(param.computeAccessId());
     338                panel = instanceAtFrame.findPanel(param.computeAccessId());
    339339                if (panel != null) {
    340340                        log.debug("found prepared panel for: " + path);
     
    353353                                        @Override
    354354                                        public void run() {
    355                                                 panel = endpoint.preparePanel(param, framsClass);
     355                                                panel = instanceAtFrame.preparePanel(param, framsClass);
    356356                                                fillPanelWithValues();
    357357                                        }
     
    503503                final Map<ValueControl, Object> changes = localChanges;
    504504                localChanges = null;
    505                 endpoint.getEndpoint().invokeLater(new RunAt<Instance>() {
     505                instanceAtFrame.getInstance().invokeLater(new RunAt<Instance>() {
    506506                        @Override
    507507                        public void run() {
     
    509509                                        final ValueControl key = e.getKey();
    510510                                        final Path p = path;
    511                                         endpoint.getEndpoint().getInstance().storeValue(p, e.getKey().getParam(), e.getValue(), new StateFunctor() {
     511                                        instanceAtFrame.getInstance().storeValue(p, e.getKey().getParam(), e.getValue(), new StateFunctor() {
    512512                                                @Override
    513513                                                public void call(Exception e) {
  • java/main/src/main/java/com/framsticks/hosting/InstanceClient.java

    r85 r88  
    1010import com.framsticks.parsers.Savers;
    1111import com.framsticks.core.LocalInstance;
     12import com.framsticks.util.dispatching.AbstractJoinable;
     13import com.framsticks.util.dispatching.Dispatching;
    1214import com.framsticks.util.dispatching.Future;
     15import com.framsticks.util.dispatching.Joinable;
     16import com.framsticks.util.dispatching.JoinableParent;
     17import com.framsticks.util.dispatching.JoinableState;
    1318
    1419import java.net.Socket;
     
    2126 * @author Piotr Sniegowski
    2227 */
    23 public class InstanceClient implements RequestHandler {
     28public class InstanceClient extends AbstractJoinable implements RequestHandler, JoinableParent {
    2429
    2530        protected final LocalInstance instance;
     
    2934                this.instance = instance;
    3035                connection = new ServerConnection(socket, this);
    31                 connection.start();
    3236        }
    3337
     
    3640                return instance + "|" + connection.toString();
    3741        }
    38 
    3942
    4043        @Override
     
    9497
    9598        }
     99
     100        @Override
     101        protected void joinableStart() {
     102                Dispatching.use(connection, this);
     103        }
     104
     105        @Override
     106        protected void joinableInterrupt() {
     107                Dispatching.drop(connection, this);
     108        }
     109
     110        @Override
     111        protected void joinableFinish() {
     112        }
     113
     114        @Override
     115        protected void joinableJoin() throws InterruptedException {
     116                Dispatching.join(connection);
     117        }
     118
     119        @Override
     120        public void childChangedState(Joinable joinable, JoinableState state) {
     121                proceedToState(state);
     122        }
     123
    96124}
  • java/main/src/main/java/com/framsticks/hosting/ServerInstance.java

    r87 r88  
    44import com.framsticks.params.ConstructionException;
    55import com.framsticks.params.FramsClass;
    6 import com.framsticks.params.Param;
    76import com.framsticks.core.LocalInstance;
     7import com.framsticks.util.dispatching.Dispatching;
    88import com.framsticks.util.dispatching.Future;
     9import com.framsticks.util.dispatching.Joinable;
     10import com.framsticks.util.dispatching.JoinableParent;
     11import com.framsticks.util.dispatching.JoinableState;
    912
    10 import org.apache.commons.configuration.Configuration;
    1113import org.apache.log4j.Logger;
    1214
     
    1416 * @author Piotr Sniegowski
    1517 */
    16 public class ServerInstance extends LocalInstance {
     18public class ServerInstance extends LocalInstance implements JoinableParent {
    1719
    1820        private final static Logger log = Logger.getLogger(ServerInstance.class.getName());
     
    2426
    2527        @Override
    26         protected void run() {
    27                 super.run();
     28        protected void firstTask() {
     29                super.firstTask();
    2830                assert hosted != null;
    29                 hosted.start();
     31                Dispatching.use(hosted, this);
    3032        }
    3133
    32         @Override
    33         public void configure(Configuration config) {
    34                 super.configure(config);
     34        // @Override
     35        // public void configure(Configuration config) {
     36        //      super.configure(config);
    3537
    36                 Configuration hostedConfig = config.subset("hosted.entity");
    37                 hosted = Program.configureEntity(hostedConfig);
    38                 if (hosted == null) {
    39                         log.fatal("failed to create hosted entity");
    40                         return;
    41                 }
    42                 hosted.setName("hosted");
    43                 hosted.configure(hostedConfig);
    44                 root = new Node(Param.build().name("root").id("root").type("o" + hosted.getClass().getCanonicalName()), hosted);
    45         }
     38        //      Configuration hostedConfig = config.subset("hosted.entity");
     39        //      hosted = Program.configureEntity(hostedConfig);
     40        //      if (hosted == null) {
     41        //              log.fatal("failed to create hosted entity");
     42        //              return;
     43        //      }
     44        //      hosted.setName("hosted");
     45        //      hosted.configure(hostedConfig);
     46        //      root = new Node(Param.build().name("root").id("root").type("o" + hosted.getClass().getCanonicalName()), hosted);
     47        // }
    4648
    4749        @Override
     
    9395        }
    9496
     97        @Override
     98        public void childChangedState(Joinable joinable, JoinableState state) {
     99                proceedToState(state);
     100
     101        }
     102
     103        @Override
     104        protected void joinableInterrupt() {
     105                Dispatching.drop(hosted, this);
     106        }
     107
     108        @Override
     109        protected void joinableFinish() {
     110
     111        }
     112
    95113}
  • java/main/src/main/java/com/framsticks/leftovers/FavouritesXMLFactory.java

    r87 r88  
    33import java.io.BufferedWriter;
    44import java.io.File;
     5import java.io.FileInputStream;
     6import java.io.FileNotFoundException;
    57import java.io.FileOutputStream;
    68import java.io.IOException;
     9import java.io.InputStream;
    710import java.io.OutputStreamWriter;
    811import java.nio.file.Files;
     
    2629import org.xml.sax.SAXException;
    2730
     31import com.framsticks.util.FramsticksException;
    2832import com.framsticks.util.io.Encoding;
    2933
     
    3640        private static final String TYPE_MARK = "type";
    3741
    38         protected Node readDocument(String filename) {
     42        public static Node readDocument(InputStream stream) {
     43                DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
     44                try {
     45                        DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
     46                        Document doc = docBuilder.parse(stream);
     47                        doc.getDocumentElement().normalize();
     48                        return doc.getFirstChild();
     49                } catch (ParserConfigurationException | SAXException | IOException e) {
     50                        throw new FramsticksException().cause(e);
     51                }
     52        }
     53
     54        public static Node readDocument(String filename) {
    3955                File file = new File(filename);
    4056                if (!file.exists()) {
    41                         return null;
    42                 }
    43                 DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory
    44                                 .newInstance();
     57                        throw new FramsticksException().msg("file does not exist");
     58                }
    4559                try {
    46                         DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
    47                         Document doc = docBuilder.parse(file);
    48                         doc.getDocumentElement().normalize();
    49                         return doc.getFirstChild();
    50 
    51                 } catch (ParserConfigurationException | SAXException | IOException e) {
    52                         log.error(e);
    53                         return null;
     60                        return readDocument(new FileInputStream(file));
     61                } catch (FileNotFoundException e) {
     62                        throw new FramsticksException().cause(e);
    5463                }
    5564        }
  • java/main/src/main/java/com/framsticks/params/FramsClass.java

    r87 r88  
    33import com.framsticks.params.annotations.FramsClassAnnotation;
    44import com.framsticks.params.annotations.ParamAnnotation;
     5import com.framsticks.util.FramsticksException;
    56// import com.framsticks.util.FramsticksException;
    67
     
    2627@Immutable
    2728@FramsClassAnnotation(id = "class", name = "class")
    28 public final class FramsClass {
     29public class FramsClass {
    2930
    3031        private final static Logger log = Logger.getLogger(FramsClass.class);
     
    5455        }
    5556
    56         public FramsClass(String id, String name, String description, List<Param> params, List<Group> groups) {
     57        public FramsClass(FramsClassBuilder builder) {
    5758
    58                 this.id = id;
    59                 this.name = name;
    60                 this.description = description;
    61                 this.groups = groups;
    62                 this.paramList = params;
     59                this.id = builder.getId();
     60                this.name = builder.getName();
     61                this.description = builder.getDescription();
     62                this.groups = builder.groups;
     63                this.paramList = builder.params;
    6364
    64                 for (Param param : params) {
     65                for (Param param : paramList) {
    6566                        paramEntryMap.put(param.getId(), param);
    6667                        try {
     
    133134        public <T extends Param> T castedParam(@Nonnull final Param param, @Nonnull final Class<T> type, Object name) {
    134135                if (param == null) {
    135                         return null;
    136                         // throw new FramsticksException().msg("param is missing").arg("name", name).arg("in", this);
     136                        // return null;
     137                        throw new FramsticksException().msg("param is missing").arg("name", name).arg("in", this);
    137138                }
    138139                if (!type.isInstance(param)) {
    139                         return null;
    140                         // throw new FramsticksException().msg("wrong type of param").arg("actual", param.getClass()).arg("requested", type).arg("in", this);
     140                        // return null;
     141                        throw new FramsticksException().msg("wrong type of param").arg("actual", param.getClass()).arg("requested", type).arg("in", this);
    141142                }
    142143                return type.cast(param);
  • java/main/src/main/java/com/framsticks/params/FramsClassBuilder.java

    r87 r88  
    2121import com.framsticks.parsers.FileSource;
    2222import com.framsticks.parsers.Loaders;
     23import com.framsticks.util.Builder;
     24import com.framsticks.util.FramsticksException;
    2325import com.framsticks.util.lang.Strings;
    2426
    2527@FramsClassAnnotation(id = "class", name = "class")
    26 public class FramsClassBuilder {
     28public class FramsClassBuilder implements Builder<FramsClass> {
    2729        private static final Logger log =
    2830                Logger.getLogger(FramsClassBuilder.class);
     
    163165        }
    164166
    165         public static Map<Class<?>, FramsClass> synchronizedCacheForBasedOnForJavaClass = Collections.synchronizedMap(new HashMap<Class<?>, FramsClass>());
     167        public static final Map<Class<?>, FramsClass> synchronizedCacheForBasedOnForJavaClass = Collections.synchronizedMap(new HashMap<Class<?>, FramsClass>());
    166168
    167169        public FramsClass forClass(Class<?> javaClass) throws ConstructionException {
     
    171173                }
    172174
    173                 log.info("building for class " + javaClass);
     175                log.debug("building for class " + javaClass);
    174176
    175177                FramsClassAnnotation fca = javaClass.getAnnotation(FramsClassAnnotation.class);
     
    184186
    185187                for (ParamCandidate pc : candidates.values()) {
    186                         param(Param.build().id(pc.getId()).name(pc.getName()).type(getParamTypeForNativeType(pc.getType())).flags(pc.getFlags()));
     188                        String type = getParamTypeForNativeType(pc.getType());
     189                        if (type == null) {
     190                                throw new FramsticksException().msg("failed to find type for param candidate").arg("candidate", pc);
     191                        }
     192                        param(Param.build().id(pc.getId()).name(pc.getName()).type(type).flags(pc.getFlags()));
    187193                }
    188194
     
    233239
    234240        public FramsClass finish() {
    235                 return new FramsClass(id, name, description, params, groups);
     241                return new FramsClass(this);
    236242        }
    237243
     
    244250        public FramsClassBuilder param(ParamBuilder builder) {
    245251                return append(builder.finish());
     252        }
     253
     254        @AutoAppendAnnotation
     255        public FramsClassBuilder group(GroupBuilder builder) {
     256                return group(builder.finish());
    246257        }
    247258
  • java/main/src/main/java/com/framsticks/params/Param.java

    r87 r88  
    5353                group = builder.getGroup();
    5454                flags = builder.getFlags();
    55                 extra = 0;
     55                extra = builder.getExtra();
    5656        }
    5757
  • java/main/src/main/java/com/framsticks/params/ParamBuilder.java

    r87 r88  
    44import com.framsticks.params.annotations.ParamAnnotation;
    55import com.framsticks.params.types.*;
     6import com.framsticks.util.Builder;
    67import com.framsticks.util.FramsticksException;
    78import com.framsticks.util.lang.Strings;
     
    2324
    2425@FramsClassAnnotation(name = "prop", id = "prop")
    25 public class ParamBuilder {
     26public class ParamBuilder implements Builder<Param> {
    2627        private final static Logger log = Logger.getLogger(ParamBuilder.class.getName());
    2728
     
    6364        private Object def;
    6465
     66        private Integer extra;
     67
    6568        String containedTypeName;
     69
     70        protected Class<?> storageType;
    6671
    6772        protected FramsClassBuilder classBuilder;
     
    8388         * @return the min
    8489         */
     90        @ParamAnnotation
    8591        public Object getMin() {
    8692                return min;
     
    9096         * @return the max
    9197         */
     98        @ParamAnnotation
    9299        public Object getMax() {
    93100                return max;
     
    97104         * @return the def
    98105         */
     106        @ParamAnnotation
    99107        public Object getDef() {
    100108                return def;
     
    135143        public Param finish() {
    136144                try {
     145                        if (paramType == null) {
     146                                throw new FramsticksException().msg("trying to finish incomplete param");
     147                        }
     148
    137149                        return paramType.getConstructor(ParamBuilder.class).newInstance(this);
    138                 } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
     150                } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | FramsticksException e) {
    139151                        throw new FramsticksException().msg("failed to create param").cause(e).arg("name", name);
    140152                }
     
    219231        public ParamBuilder type(String type) {
    220232                // typeString = type;
     233                assert type != null;
    221234
    222235                log.trace("parsing type: " + type);
     
    352365        }
    353366
     367        @ParamAnnotation(id = "xtra")
     368        public Integer getExtra() {
     369                return extra;
     370        }
     371
    354372        /**
    355373         * @return the paramType
     
    359377        }
    360378
     379        @ParamAnnotation(id = "xtra")
     380        public ParamBuilder extra(Integer extra) {
     381                this.extra = extra;
     382                return this;
     383        }
     384
     385        @ParamAnnotation
    361386        public ParamBuilder min(Object min) {
    362387                this.min = min;
     
    364389        }
    365390
     391        @ParamAnnotation
    366392        public ParamBuilder max(Object max) {
    367393                this.max = max;
     
    369395        }
    370396
     397        @ParamAnnotation
    371398        public ParamBuilder def(Object def) {
    372399                this.def = def;
     
    374401        }
    375402
    376         // public Class<?> getStorageType() {
    377         //      assert param != null;
    378         //      return param.getStorageType();
    379         // }
    380403
    381404        public Param build(String line) throws Exception {
     
    435458        }
    436459
    437         public ParamBuilder defaultDef(Object def) {
     460        public ParamBuilder fillDef(Object def) {
    438461                if (this.def == null) {
    439462                        return def(def);
     
    442465        }
    443466
     467        public ParamBuilder fillStorageType(Class<?> storageType) {
     468                if (this.storageType == null) {
     469                        this.storageType = storageType;
     470                }
     471                return this;
     472        }
     473
     474
     475        public Class<?> getStorageType() {
     476                return storageType;
     477        }
    444478}
     479
  • java/main/src/main/java/com/framsticks/params/ParamCandidate.java

    r86 r88  
    132132                                return;
    133133                        }
    134                         if (field.has()) {
     134                        if (isPublic(field)) {
    135135                                if (setter.has()) {
    136136                                        throw new ConstructionException().msg("setter and field coexist");
     
    138138                        }
    139139
    140                         if (getter.get() == null) {
    141                                 throw new ConstructionException().msg("missing getter");
     140                        if (!getter.has() && !field.has()) {
     141                                throw new ConstructionException().msg("missing getter or field");
    142142                        }
    143143                } catch (ConstructionException e) {
     
    211211        @Override
    212212        public String toString() {
    213                 return id;
     213                return id + "(" + type.toString() + ")";
    214214        }
    215215
  • java/main/src/main/java/com/framsticks/params/PrimitiveParam.java

    r87 r88  
    22
    33import com.framsticks.util.FramsticksException;
     4import com.framsticks.util.Misc;
    45import com.framsticks.util.lang.Numbers;
    56
     
    2627        public PrimitiveParam(ParamBuilder builder) {
    2728                super(builder);
    28                 min = builder.getMin();
    29                 max = builder.getMax();
    30                 def = builder.getDef();
     29                Class<?> storageType = Misc.returnNotNull(builder.getStorageType(), Object.class);
     30                min = tryCastAndReturn(builder.getMin(), storageType);
     31                max = tryCastAndReturn(builder.getMax(), storageType);
     32                def = tryCastAndReturn(builder.getDef(), storageType);
    3133        }
    3234
  • java/main/src/main/java/com/framsticks/params/ReflectionAccess.java

    r87 r88  
    66import java.util.Collections;
    77import java.util.HashMap;
     8import java.util.LinkedList;
     9import java.util.List;
    810import java.util.Map;
    911
     
    3739        public static class Backend {
    3840
    39                 protected static Map<Pair<Class<?>, FramsClass>, Backend> synchronizedCache = Collections.synchronizedMap(new HashMap<Pair<Class<?>, FramsClass>, Backend>());
     41                protected static final Map<Pair<Class<?>, FramsClass>, Backend> synchronizedCache = Collections.synchronizedMap(new HashMap<Pair<Class<?>, FramsClass>, Backend>());
    4042
    4143                public static class ReflectedValueParam {
     
    5355
    5456                protected final Map<ValueParam, ReflectedValueParam> params;
    55                 protected final Map<Class<?>, Method> autoAppendMethods;
     57                protected final List<Method> autoAppendMethods;
    5658
    5759                /**
    5860                 * @param params
    5961                 */
    60                 public Backend(Map<ValueParam, ReflectedValueParam> params, Map<Class<?>, Method> autoAppendMethods) {
     62                public Backend(Map<ValueParam, ReflectedValueParam> params, List<Method> autoAppendMethods) {
    6163                        // this.params = Collections.unmodifiableMap(params);
    6264                        this.params = params;
     
    140142                        }
    141143
    142                         Map<Class<?>, Method> autoAppendMethods = new HashMap<>();
     144                        List<Method> autoAppendMethods = new LinkedList<>();
    143145
    144146                        Class<?> javaClass = reflectedClass;
     
    154156                                                throw new ConstructionException().msg("invalid number of arguments in AutoAppend marked method").arg("method", m).arg("arguments", args.length);
    155157                                        }
    156                                         autoAppendMethods.put(args[0], m);
     158                                        autoAppendMethods.add(m);
    157159                                }
    158160
     
    327329        public boolean tryAutoAppend(Object value) {
    328330                assert object != null;
    329                 for (Map.Entry<Class<?>, Method> a : backend.autoAppendMethods.entrySet()) {
    330                         if (a.getKey().isAssignableFrom(value.getClass())) {
     331                for (Method m : backend.autoAppendMethods) {
     332                        if (m.getParameterTypes()[0].isAssignableFrom(value.getClass())) {
    331333                                try {
    332                                         a.getValue().invoke(object, value);
     334                                        m.invoke(object, value);
    333335                                        return true;
    334                                 } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
    335                                         throw new FramsticksException().msg("failed to auto append").cause(e).arg("value", value).arg("into object", object).arg("with method", a.getValue());
     336                                } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | FramsticksException e) {
     337                                        throw new FramsticksException().msg("failed to auto append").cause(e).arg("value", value).arg("into object", object).arg("with method", m);
    336338                                }
    337339                        }
  • java/main/src/main/java/com/framsticks/params/Registry.java

    r87 r88  
    44
    55import com.framsticks.params.annotations.FramsClassAnnotation;
     6import com.framsticks.util.DoubleMap;
     7import com.framsticks.util.FramsticksException;
    68
    7 import java.util.Collections;
    8 import java.util.HashMap;
    9 import java.util.HashSet;
    10 import java.util.Map;
    119import java.util.Set;
    1210
     
    1614public class Registry {
    1715        private static final Logger log = Logger.getLogger(Registry.class.getName());
    18 
    19         public static class DoubleSet<K1, K2, V> {
    20                 protected final Map<K1, V> byId = new HashMap<>();
    21                 protected final Map<K2, V> byName = new HashMap<>();
    22                 protected final Set<V> values = new HashSet<>();
    23 
    24                 public int size() {
    25                         return values.size();
    26                 }
    27 
    28                 public void put(K1 id, K2 name, V value) {
    29                         values.add(value);
    30                         if (id != null) {
    31                                 byId.put(id, value);
    32                         }
    33                         if (name != null) {
    34                                 byName.put(name, value);
    35                         }
    36                 }
    37 
    38                 public boolean containsValue(V value) {
    39                         return values.contains(value);
    40 
    41                 }
    42 
    43                 public boolean containsKey(String identifier) {
    44                         return byId.containsKey(identifier) || byName.containsKey(identifier);
    45                 }
    46 
    47                 public V get(String identifier) {
    48                         if (byId.containsKey(identifier)) {
    49                                 return byId.get(identifier);
    50                         }
    51                         if (byName.containsKey(identifier)) {
    52                                 return byName.get(identifier);
    53                         }
    54                         return null;
    55                 }
    56 
    57                 public Set<V> getValues() {
    58                         return Collections.unmodifiableSet(values);
    59                 }
    60         }
    6116
    6217        // protected void internalRegisterClass(FramsClass framsClass, @Nullable Class<?> javaClass) {
     
    7126        //      }
    7227        // }
    73         protected final DoubleSet<String, String, Class<?>> javaClasses = new DoubleSet<>();
    74         protected final DoubleSet<String, String, FramsClass> framsClasses = new DoubleSet<>();
     28        protected final DoubleMap<String, Class<?>> javaClasses = new DoubleMap<>();
     29        protected final DoubleMap<String, FramsClass> framsClasses = new DoubleMap<>();
    7530
    7631        public void registerReflectedClass(String name, String id, Class<?> reflectedClass) {
     
    7833        }
    7934
     35        public Registry registerAndBuild(Class<?> reflectedClass) {
     36                register(reflectedClass);
     37                putInfoIntoCache(FramsClass.build().forClass(reflectedClass));
     38                return this;
     39        }
     40
    8041        public Registry register(Class<?> reflectedClass) {
    8142                FramsClassAnnotation a = reflectedClass.getAnnotation(FramsClassAnnotation.class);
    8243                if (a == null) {
    83                         log.error("class is not annotated: " + reflectedClass);
    84                         return this;
     44                        throw new FramsticksException().msg("class is not annotated").arg("class", reflectedClass);
    8545                }
    8646
    8747                registerReflectedClass(FramsClassBuilder.getName(a, reflectedClass), FramsClassBuilder.getId(a, reflectedClass), reflectedClass);
    88 
    8948                return this;
    9049        }
    9150
    9251        public AccessInterface createAccess(String name, FramsClass framsClass) throws ConstructionException {
    93                 assert framsClasses.containsValue(framsClass);
     52                // assert framsClasses.containsValue(framsClass);
    9453                if (javaClasses.containsKey(name)) {
    9554                        return new ReflectionAccess(javaClasses.get(name), framsClass);
  • java/main/src/main/java/com/framsticks/params/types/BooleanParam.java

    r87 r88  
    2020         */
    2121        public BooleanParam(ParamBuilder builder) {
    22                 super(builder.defaultDef(false));
     22                super(builder.fillDef(false).fillStorageType(Boolean.class));
    2323        }
    2424
  • java/main/src/main/java/com/framsticks/params/types/DecimalParam.java

    r87 r88  
    1717         */
    1818        public DecimalParam(ParamBuilder builder) {
    19                 super(builder.defaultDef(0));
     19                super(builder.fillDef(0).fillStorageType(Integer.class));
    2020        }
    2121
  • java/main/src/main/java/com/framsticks/params/types/FloatParam.java

    r87 r88  
    1717         */
    1818        public FloatParam(ParamBuilder builder) {
    19                 super(builder.defaultDef(0.0));
     19                super(builder.fillDef(0.0).fillStorageType(Double.class));
    2020        }
    2121
  • java/main/src/main/java/com/framsticks/parsers/F0Parser.java

    r87 r88  
    1111
    1212import com.framsticks.model.Model;
     13import com.framsticks.model.f0.Schema;
     14
    1315import static com.framsticks.params.SimpleAbstractAccess.*;
    1416
     
    4951                        Pair<String, String> p = Strings.splitIntoPair(line, ':', "");
    5052                        String classId = p.first.trim();
    51                         FramsClass framsClass = schema.getRegistry().getInfoFromCache(classId);
     53                        FramsClass framsClass = schema.getFramsClass(classId);
    5254                        if (framsClass == null) {
    5355                                throw new Exception("unknown class id: " + classId);
  • java/main/src/main/java/com/framsticks/parsers/F0Writer.java

    r87 r88  
    22
    33import com.framsticks.model.Model;
     4import com.framsticks.model.f0.Schema;
    45import com.framsticks.params.*;
    56import com.framsticks.util.Misc;
  • java/main/src/main/java/com/framsticks/parsers/Loaders.java

    r87 r88  
    11package com.framsticks.parsers;
     2
     3import javax.annotation.Nonnull;
    24
    35import com.framsticks.params.*;
     
    1113        // private static final Logger log = Logger.getLogger(Loaders.class.getName());
    1214
    13         public static FramsClass loadFramsClass(SourceInterface source) throws ConstructionException {
     15        public static @Nonnull FramsClass loadFramsClass(SourceInterface source) throws ConstructionException {
    1416                final MultiParamLoader loader = new MultiParamLoader();
    1517                loader.setNewSource(source);
  • java/main/src/main/java/com/framsticks/parsers/MultiParamLoader.java

    r87 r88  
    4343        protected AccessInterface lastAccessInterface;
    4444
    45         protected static FramsClass emptyFramsClass = FramsClass.build().idAndName("<empty>").finish();
     45        protected static final FramsClass emptyFramsClass = FramsClass.build().idAndName("<empty>").finish();
    4646        /**
    4747         * Empty Param representing unknown classes - used to omit unknown
  • java/main/src/main/java/com/framsticks/parsers/XmlLoader.java

    r87 r88  
    11package com.framsticks.parsers;
    22
     3import java.io.InputStream;
     4
     5import javax.xml.parsers.DocumentBuilder;
     6import javax.xml.parsers.DocumentBuilderFactory;
     7
     8import org.apache.log4j.Logger;
     9import org.w3c.dom.Document;
     10import org.w3c.dom.Element;
     11import org.w3c.dom.NamedNodeMap;
     12import org.w3c.dom.Node;
     13import org.w3c.dom.NodeList;
     14
     15import com.framsticks.params.AccessInterface;
     16import com.framsticks.params.Registry;
     17import com.framsticks.util.FramsticksException;
     18
    319public class XmlLoader {
     20        private static final Logger log = Logger.getLogger(XmlLoader.class);
    421
     22        protected Registry registry = new Registry();
     23
     24        /**
     25         *
     26         */
     27        public XmlLoader() {
     28        }
     29
     30        /**
     31         * @return the registry
     32         */
     33        public Registry getRegistry() {
     34                return registry;
     35        }
     36
     37        boolean useLowerCase = false;
     38
     39        /**
     40         * @param useLowerCase the useLowerCase to set
     41         */
     42        public void setUseLowerCase(boolean useLowerCase) {
     43                this.useLowerCase = useLowerCase;
     44        }
     45
     46        public Object processElement(Element element) {
     47                String name = element.getNodeName();
     48                if (useLowerCase) {
     49                        name = name.toLowerCase();
     50                }
     51                if (name.equals("import")) {
     52                        String className = element.getAttribute("class");
     53                        try {
     54                                registry.registerAndBuild(Class.forName(className));
     55                                return null;
     56                        } catch (ClassNotFoundException e) {
     57                                throw new FramsticksException().msg("failed to import class").arg("name", name).cause(e);
     58                        }
     59                }
     60
     61                AccessInterface access = registry.createAccess(name);
     62
     63                if (access == null) {
     64                        throw new FramsticksException().msg("failed to find access interface").arg("name", name);
     65                }
     66                Object object = access.createAccessee();
     67                assert object != null;
     68                access.select(object);
     69
     70                NamedNodeMap attributes = element.getAttributes();
     71                for (int i = 0; i < attributes.getLength(); ++i) {
     72                        Node attributeNode = attributes.item(i);
     73                        access.set(attributeNode.getNodeName().toLowerCase(), attributeNode.getNodeValue());
     74                }
     75
     76                NodeList children = element.getChildNodes();
     77                log.debug("found " + children.getLength() + " children in " + object);
     78                for (int i = 0; i < children.getLength(); ++i) {
     79                        Node childNode = children.item(i);
     80                        if (!(childNode instanceof Element)) {
     81                                continue;
     82                        }
     83                        Object childObject = processElement((Element) childNode);
     84                        if (childObject == null) {
     85                                continue;
     86                        }
     87
     88                        if (!access.tryAutoAppend(childObject)) {
     89                                throw new FramsticksException().msg("failed to auto append").arg("child", childObject).arg("parent", object);
     90                        }
     91                }
     92                log.debug("loaded " + object);
     93
     94                return object;
     95        }
     96
     97        public Object load(InputStream stream) {
     98                try {
     99                        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
     100                        DocumentBuilder db = factory.newDocumentBuilder();
     101
     102                        Document document = db.parse(stream);
     103                        document.getDocumentElement().normalize();
     104                        Element element = document.getDocumentElement();
     105                        assert element != null;
     106
     107                        return processElement(element);
     108
     109                } catch (Exception e) {
     110                        throw new FramsticksException().msg("failed to load").cause(e);
     111                }
     112        }
     113
     114        public <T> T load(InputStream stream, Class<T> type) {
     115                registry.registerAndBuild(type);
     116
     117                Object object = load(stream);
     118                if (type.isAssignableFrom(object.getClass())) {
     119                        return type.cast(object);
     120                }
     121                throw new FramsticksException().msg("invalid type has been loaded");
     122        }
    5123}
     124
  • java/main/src/main/java/com/framsticks/portals/Portal.java

    r86 r88  
    11package com.framsticks.portals;
    22
    3 import com.framsticks.observers.Observer;
     3
     4import com.framsticks.core.AbstractInstanceListener;
     5import com.framsticks.core.Instance;
     6import com.framsticks.core.Path;
    47import com.framsticks.params.annotations.FramsClassAnnotation;
    58import com.framsticks.params.annotations.ParamAnnotation;
    6 import com.framsticks.util.PeriodicTask;
     9import com.framsticks.util.Logging;
     10import com.framsticks.util.dispatching.Dispatching;
     11import com.framsticks.util.dispatching.Future;
     12import com.framsticks.util.dispatching.JoinableCollection;
     13import com.framsticks.util.dispatching.RunAt;
     14
    715import org.apache.log4j.Logger;
    816
     
    1220 */
    1321@FramsClassAnnotation
    14 public class Portal extends Observer {
     22public class Portal extends JoinableCollection<Instance> {
    1523
    1624        private final static Logger log = Logger.getLogger(Portal.class.getName());
     
    2230        }
    2331
    24         @Override
    25         public void run() {
    26                 super.run();
    27                 new PeriodicTask<Portal>(this, 1000) {
     32        // @Override
     33        // public void run() {
     34        //      super.run();
     35        //      new PeriodicTask<Portal>(this, 1000) {
    2836
    29                         @Override
    30                         public void run() {
    31                                 ++counter;
    32                                 log.debug("counter is now: " + counter);
    33                                 again();
    34                         }
    35                 };
    36         }
     37        //              @Override
     38        //              public void run() {
     39        //                      ++counter;
     40        //                      log.debug("counter is now: " + counter);
     41        //                      again();
     42        //              }
     43        //      };
     44        // }
    3745
    3846        @Override
    39         protected PortalEndpoint createEndpoint() {
    40                 return new PortalEndpoint();
     47        public void add(final Instance instance) {
     48                super.add(instance);
     49                instance.addListener(new AbstractInstanceListener() {
     50                        @Override
     51                        public void onRun(Exception e) {
     52                                assert Dispatching.isThreadSafe();
     53
     54                                super.onRun(e);
     55
     56                                if (e != null) {
     57                                        return;
     58                                }
     59                                final String path = "/simulator/genepools/groups/0/genotypes";
     60                                instance.invokeLater(new RunAt<Instance>() {
     61                                        @Override
     62                                        public void run() {
     63                                                instance.resolve(path, new Future<Path>() {
     64                                                        @Override
     65                                                        public void result(Path result, Exception e) {
     66                                                                Logging.log(log, "resolve", path, e);
     67                                                        }
     68                                                });
     69                                        }
     70                                });
     71                        }
     72                });
    4173        }
    4274
  • java/main/src/main/java/com/framsticks/remote/RemoteInstance.java

    r87 r88  
    99import com.framsticks.core.Path;
    1010import com.framsticks.params.*;
     11import com.framsticks.params.annotations.FramsClassAnnotation;
     12import com.framsticks.params.annotations.ParamAnnotation;
    1113import com.framsticks.params.types.EventParam;
    1214import com.framsticks.parsers.MultiParamLoader;
     
    1517import com.framsticks.util.dispatching.Dispatching;
    1618import com.framsticks.util.dispatching.Future;
     19import com.framsticks.util.dispatching.Joinable;
     20import com.framsticks.util.dispatching.JoinableParent;
     21import com.framsticks.util.dispatching.JoinableState;
    1722import com.framsticks.util.lang.Casting;
    1823import com.framsticks.util.lang.Pair;
    1924import com.framsticks.util.dispatching.RunAt;
    2025
    21 import org.apache.commons.configuration.Configuration;
     26import java.util.*;
     27
    2228import org.apache.log4j.Logger;
    23 
    24 import java.util.*;
    2529
    2630/**
    2731 * @author Piotr Sniegowski
    2832 */
    29 public class RemoteInstance extends Instance {
     33@FramsClassAnnotation
     34public class RemoteInstance extends Instance implements JoinableParent {
    3035
    3136        private final static Logger log = Logger.getLogger(RemoteInstance.class.getName());
     
    4550        }
    4651
    47         @Override
    48         public void run() {
    49                 assert isActive();
    50                 super.run();
    51                 connection.connect(new StateFunctor() {
     52        public RemoteInstance() {
     53        }
     54
     55        @ParamAnnotation
     56        public void setAddress(String address) {
     57                setConnection(new ClientConnection(address));
     58        }
     59
     60        @ParamAnnotation
     61        public String getAddress() {
     62                return connection == null ? "<disconnected>" : connection.getAddress();
     63        }
     64
     65        public void setConnection(final ClientConnection connection) {
     66                this.connection = connection;
     67                this.connection.setConnectedFunctor(new StateFunctor() {
    5268                        @Override
    5369                        public void call(Exception e) {
     
    6076                                        public void call(Exception e) {
    6177                                                if (e != null) {
    62                                                         log.fatal("unsupported protocol version!\n minimal version is: "
    63                                                                         + "nmanager protocol is: "
    64                                                                         + connection.getProtocolVersion());
    65                                                         connection.close();
     78                                                        log.fatal("unsupported protocol version!\n minimal version is: " + "\nmanager protocol is: " + connection.getProtocolVersion());
     79                                                        Dispatching.drop(connection, RemoteInstance.this);
    6680                                                        fireRun(e);
    6781                                                        return;
     
    112126                        }
    113127                });
    114         }
    115 
    116         public RemoteInstance() {
    117         }
    118 
    119 
    120         @Override
    121         public void configure(Configuration config) {
    122                 super.configure(config);
    123                 connection = new ClientConnection(config.getString("address"));
    124         }
    125 
    126         public void setAddress(String address) {
    127                 setConnection(new ClientConnection(address));
    128         }
    129 
    130         public void setConnection(ClientConnection connection) {
    131                 this.connection = connection;
     128
    132129        }
    133130
     
    135132        public String toString() {
    136133                assert Dispatching.isThreadSafe();
    137                 return getConnection().getAddress();
     134                return "remote instance " + getName() + "(" + getAddress() + ")";
    138135        }
    139136
     
    167164                        }
    168165                });
    169                 */
     166                 */
    170167        }
    171168
     
    175172        }
    176173
    177         public void disconnect() {
    178                 assert isActive();
    179                 if (connection.isConnected()) {
    180                         connection.close();
    181                 }
    182         }
     174        // public void disconnect() {
     175        //      assert isActive();
     176        //      if (connection.isConnected()) {
     177        //              Dispatching.stop(connection, this);
     178        //      }
     179        // }
    183180
    184181        public final ClientConnection getConnection() {
     
    247244                                assert response.getFiles().size() == 1;
    248245                                assert path.isTheSame(response.getFiles().get(0).getPath());
    249                                 FramsClass framsClass = processFetchedInfo(response.getFiles().get(0));
    250 
    251                                 if (framsClass == null) {
     246                                FramsClass framsClass;
     247                                try {
     248                                        framsClass = processFetchedInfo(response.getFiles().get(0));
     249                                } catch (ConstructionException e) {
    252250                                        log.fatal("could not read class info");
    253251                                        finishInfoRequest(name, null, new Exception("could not read class info"));
    254252                                        return;
    255253                                }
     254
    256255                                CompositeParam thisParam = path.getTop().getParam();
    257256                                if (!thisParam.isMatchingContainedName(framsClass.getId())) {
     
    335334                }
    336335
    337 
    338336                assert path.size() >= 2;
    339337                FramsClass underFramsClass = getInfoFromCache(path.getUnder().getParam().getContainedTypeName());
    340338
    341                 EventParam changedEvent = underFramsClass.getParamEntry(path.getTop().getParam().getId() + "_changed", EventParam.class);
    342                 if (changedEvent == null) {
     339                EventParam changedEvent;
     340                try {
     341                        changedEvent = underFramsClass.getParamEntry(path.getTop().getParam().getId() + "_changed", EventParam.class);
     342                } catch (FramsticksException e) {
    343343                        return;
    344344                }
    345345
     346                log.debug("registering for " + changedEvent);
    346347                if (getSubscription(path) != null) {
    347348                        return;
     
    394395        }
    395396
    396 
    397397        protected void reactToChange(final Path path, final ListChange listChange) {
    398398                assert isActive();
     
    416416                }
    417417
    418 
    419418                CompositeParam childParam = Casting.tryCast(CompositeParam.class, access.getParam(listChange.getBestIdentifier()));
    420419                assert childParam != null;
    421420                switch (listChange.getAction()) {
    422                         case Add: {
    423                                 final String p = path.getTextual() + "/" + childParam.getId();
    424                                 resolveAndFetch(p, new Future<Path>() {
    425                                         @Override
    426                                         public void result(Path result, Exception e) {
    427                                                 if (e != null) {
    428                                                         log.error("failed to add " + p + ": " + e);
    429                                                         return;
    430                                                 }
    431                                                 log.debug("added: " + result);
    432                                                 fireListChange(path, listChange);
    433                                         }
    434                                 });
    435                                 break;
    436                         }
    437                         case Remove: {
    438                                 access.set(childParam, null);
    439                                 fireListChange(path, listChange);
    440                                 break;
    441                         }
    442                         case Modify: {
    443                                 final String p = path.getTextual() + "/" + childParam.getId();
    444                                 resolveAndFetch(p, new Future<Path>() {
    445                                         @Override
    446                                         public void result(Path result, Exception e) {
    447                                                 if (e != null) {
    448                                                         log.error("failed to modify " + p + ": " + e);
    449                                                         return;
    450                                                 }
    451                                                 fireListChange(path, listChange);
    452                                         }
    453                                 });
    454                                 break;
    455                         }
     421                case Add: {
     422                        final String p = path.getTextual() + "/" + childParam.getId();
     423                        resolveAndFetch(p, new Future<Path>() {
     424                                @Override
     425                                public void result(Path result, Exception e) {
     426                                        if (e != null) {
     427                                                log.error("failed to add " + p + ": " + e);
     428                                                return;
     429                                        }
     430                                        log.debug("added: " + result);
     431                                        fireListChange(path, listChange);
     432                                }
     433                        });
     434                        break;
     435                }
     436                case Remove: {
     437                        access.set(childParam, null);
     438                        fireListChange(path, listChange);
     439                        break;
     440                }
     441                case Modify: {
     442                        final String p = path.getTextual() + "/" + childParam.getId();
     443                        resolveAndFetch(p, new Future<Path>() {
     444                                @Override
     445                                public void result(Path result, Exception e) {
     446                                        if (e != null) {
     447                                                log.error("failed to modify " + p + ": " + e);
     448                                                return;
     449                                        }
     450                                        fireListChange(path, listChange);
     451                                }
     452                        });
     453                        break;
     454                }
    456455                }
    457456        }
     
    473472                });
    474473        }
     474
     475        @Override
     476        protected void joinableStart() {
     477                Dispatching.use(connection, this);
     478                super.joinableStart();
     479        }
     480
     481        @Override
     482        protected void joinableInterrupt() {
     483                Dispatching.drop(connection, this);
     484                super.joinableInterrupt();
     485        }
     486
     487        @Override
     488        protected void joinableFinish() {
     489                super.joinableFinish();
     490
     491        }
     492
     493        @Override
     494        public void joinableJoin() throws InterruptedException {
     495                Dispatching.join(connection);
     496                super.joinableJoin();
     497        }
     498
     499
     500        @Override
     501        public void childChangedState(Joinable joinable, JoinableState state) {
     502                proceedToState(state);
     503        }
     504
     505
    475506}
  • java/main/src/main/java/com/framsticks/util/FramsticksException.java

    r87 r88  
    5050                        b.append("(").append(d.build()).append(")");
    5151                }
    52                 if (this.getCause() instanceof FramsticksException) {
    53                         b.append(" caused by ").append(this.getCause().getMessage());
     52                if (this.getCause() != null) {
     53                        b.append(" caused by: [").append(this.getCause().getMessage()).append("]");
    5454                }
    5555                return b.toString();
  • java/main/src/main/java/com/framsticks/util/Misc.java

    r84 r88  
    11package com.framsticks.util;
     2
     3// import org.apache.log4j.Logger;
    24
    35/**
     
    57 */
    68public class Misc {
     9        // private static final Logger log =
     10        //      Logger.getLogger(Misc.class);
     11
     12        public static class WithType {
     13                protected Object value;
     14
     15                /**
     16                 * @param value
     17                 */
     18                public WithType(Object value) {
     19                        this.value = value;
     20                }
     21
     22                @Override
     23                public String toString() {
     24                        if (value == null) {
     25                                return "null";
     26                        }
     27                        return value + "(" + value.getClass() + ")";
     28                }
     29        }
     30
     31        public static WithType withType(Object value) {
     32                return new WithType(value);
     33        }
     34
    735        public static boolean equals(Object a, Object b) {
     36                // log.info("equality of " + withType(a) + " ? " + withType(b));
    837                if (a != null) {
    938                        return (b != null && a.equals(b));
     
    1140                return b == null;
    1241        }
     42
     43        public static <T> T returnNotNull(T first, T second) {
     44                if (first != null) {
     45                        return first;
     46                }
     47                return second;
     48        }
     49
     50        public static <T> T throwIfNull(T value) {
     51                if (value == null) {
     52                        throw new FramsticksException().msg("value should not be null");
     53                }
     54                return value;
     55        }
    1356}
  • java/main/src/main/java/com/framsticks/util/dispatching/AtOnceDispatcher.java

    r85 r88  
    2323                runnable.run();
    2424        }
     25
     26
    2527}
  • java/main/src/main/java/com/framsticks/util/dispatching/Dispatcher.java

    r85 r88  
    77        public boolean isActive();
    88        public void invokeLater(RunAt<? extends C> runnable);
     9
    910}
  • java/main/src/main/java/com/framsticks/util/dispatching/Dispatching.java

    r85 r88  
    11package com.framsticks.util.dispatching;
     2
     3import org.apache.log4j.Logger;
    24
    35import com.framsticks.util.StateFunctor;
     
    79 */
    810public abstract class Dispatching {
     11        private static final Logger log = Logger.getLogger(Dispatching.class);
    912
    1013        public static boolean isThreadSafe() {
     
    3134
    3235        // public static boolean assertInvokeLater(Dispatcher dispatcher, RunAt runnable) {
    33         //      dispatcher.invokeLater(runnable);
    34         //      return true;
     36        //      dispatcher.invokeLater(runnable);
     37        //      return true;
    3538        // }
    3639
     
    4447        }
    4548
     49        public static void sleep(int milliseconds) {
     50                try {
     51                        java.lang.Thread.sleep(milliseconds, 0);
     52                } catch (InterruptedException e) {
     53
     54                }
     55        }
     56
     57        @SuppressWarnings("unchecked")
     58        public static void dispatcherGuardedInvoke(Joinable joinable, RunAt<?> runnable) {
     59                if (joinable instanceof Dispatcher) {
     60                        invokeLaterOrNow(Dispatcher.class.cast(joinable), runnable);
     61                        return;
     62                }
     63                runnable.run();
     64        }
     65
     66        public static void use(final Joinable joinable, final JoinableParent owner) {
     67                log.debug("using " + joinable + " by " + owner);
     68                if (joinable.use(owner)) {
     69                        log.debug("started " + joinable);
     70                } else {
     71                        log.debug("start of " + joinable + " already happened");
     72                }
     73        }
     74
     75
     76        public static void drop(final Joinable joinable, final JoinableParent owner) {
     77                log.debug("droping " + joinable + " by " + owner);
     78                if (joinable.drop(owner)) {
     79                        log.debug("stoped " + joinable);
     80                } else {
     81                        log.debug("stop of " + joinable + " deferred");
     82                }
     83        }
     84
     85        public static void join(Joinable joinable) throws InterruptedException {
     86                log.debug("joining " + joinable);
     87                try {
     88                        joinable.join();
     89                } catch (InterruptedException e) {
     90                        log.debug("failed to join " + joinable);
     91                        throw e;
     92                }
     93                log.debug("joined " + joinable);
     94        }
     95
     96        public static void childChangedState(final JoinableParent parent, final Joinable joinable, final JoinableState state) {
     97                dispatcherGuardedInvoke(joinable, new RunAt<Object>() {
     98                        @Override
     99                        public void run() {
     100                                log.debug("joinable " + joinable + " is notifying parent " + parent + " about change to " + state);
     101                                parent.childChangedState(joinable, state);
     102                        }
     103                });
     104        }
     105
     106        public static void wait(Object object, long millis) {
     107                try {
     108                        object.wait(millis);
     109                } catch (InterruptedException e) {
     110                }
     111        }
     112
     113        public static void joinAbsolutely(Joinable joinable) {
     114                log.info("joining absolutely " + joinable);
     115                while (true) {
     116                        try {
     117                                Dispatching.join(joinable);
     118                                return;
     119                        } catch (InterruptedException e) {
     120                                // throw new FramsticksException().msg("failed to join").arg("dispatcher", dispatcher).cause(e);
     121                        }
     122                        log.info("waiting for " + joinable);
     123                        sleep(500);
     124                }
     125        }
     126
     127
     128
     129
    46130}
  • java/main/src/main/java/com/framsticks/util/dispatching/Thread.java

    r85 r88  
    55import java.util.LinkedList;
    66import java.util.ListIterator;
     7
     8import javax.annotation.OverridingMethodsMustInvokeSuper;
     9
     10import com.framsticks.params.annotations.ParamAnnotation;
    711import com.framsticks.util.dispatching.RunAt;
    812
     
    1014 * @author Piotr Sniegowski
    1115 */
    12 public class Thread<C> implements Dispatcher<C> {
     16public class Thread<C> extends AbstractJoinable implements Dispatcher<C> {
    1317
    1418        private static final Logger log = Logger.getLogger(Thread.class.getName());
     
    2731        }
    2832
    29         public Thread(String s) {
    30                 this();
    31                 thread.setName(s);
    32                 // thread.start();
     33        @OverridingMethodsMustInvokeSuper
     34        protected void firstTask() {
    3335        }
    3436
    35         public Thread(String s, java.lang.Thread thread) {
     37        public Thread(java.lang.Thread thread) {
    3638                this.thread = thread;
    37                 thread.setName(s);
    3839        }
    3940
    40         public Thread<C> start() {
     41        @Override
     42        protected void joinableStart() {
    4143                thread.start();
    42                 return this;
    4344        }
    4445
     
    4950
    5051        protected void routine() {
     52                log.debug("starting thread " + this);
     53                firstTask();
    5154                while (!java.lang.Thread.interrupted()) {
    5255                        Task<? extends C> task;
     
    7679                        } catch (Exception e) {
    7780                                log.error("error in thread: " + e);
    78                                 e.printStackTrace();
    7981                        }
    8082                }
     83                log.debug("finishing thread " + this);
     84                finish();
    8185        }
    8286
     
    124128        }
    125129
    126         public void interrupt() {
     130        @Override
     131        protected void joinableInterrupt() {
    127132                thread.interrupt();
    128133        }
    129134
    130         public void join() throws InterruptedException {
    131                 thread.join();
     135        @Override
     136        protected void joinableJoin() throws InterruptedException {
     137                thread.join(500);
     138                log.debug("joined " + this);
    132139        }
    133140
     141        @ParamAnnotation
    134142        public void setName(String name) {
    135143                thread.setName(name);
     144        }
    136145
     146        @ParamAnnotation
     147        public String getName() {
     148                return thread.getName();
    137149        }
    138150
     
    140152                return java.lang.Thread.interrupted();
    141153        }
     154
     155        @Override
     156        public String toString() {
     157                return getName();
     158        }
     159
     160        @Override
     161        protected void joinableFinish() {
     162        }
     163
    142164}
  • java/main/src/main/resources/configs/framsticks.xml

    r87 r88  
    11<?xml version="1.0" encoding="UTF-8"?>
    2 <framsticks>
    3         <com.framsticks.gui.Browser>
    4                 <size>1500 800</size>
    5                 <endpoint>
    6                         <com.framsticks.remote.RemoteInstance>
    7                                 <name>localhost:9009</name>
    8                                 <address>localhost:9009</address>
    9                         </com.framsticks.remote.RemoteInstance>
    10                 </endpoint>
    11         </com.framsticks.gui.Browser>
    12 </framsticks>
     2<Framsticks>
     3        <import class="com.framsticks.gui.Browser" />
     4        <import class="com.framsticks.remote.RemoteInstance" />
     5        <Browser>
     6                <RemoteInstance name="localhost:9009" address="localhost:9009" />
     7        </Browser>
     8        <!-- <Browser name="other"> -->
     9        <!--    <RemoteInstance name="localhost:9009" address="localhost:9009" /> -->
     10        <!-- </Browser> -->
     11</Framsticks>
  • java/main/src/main/resources/configs/log4j.properties

    r84 r88  
    2929
    3030log4j.logger.com.framsticks=INFO
     31# log4j.logger.com.framsticks.util.dispatching.Dispatching=DEBUG
     32# log4j.logger.com.framsticks.util.dispatching.AbstractJoinable=DEBUG
     33# log4j.logger.com.framsticks.util.dispatching.JoinableCollection=DEBUG
     34
     35# log4j.logger.com.framsticks.gui=DEBUG
    3136# log4j.logger.com.framsticks.gui.controls.SliderControl=TRACE
    3237# log4j.logger.com.framsticks.gui.EndpointAtFrame=DEBUG
  • java/main/src/test/java/com/framsticks/gui/BrowserTest.java

    r87 r88  
    33import javax.swing.JFrame;
    44
    5 import org.apache.commons.configuration.PropertiesConfiguration;
    65import org.apache.log4j.Logger;
    76import org.fest.swing.edt.FailOnThreadViolationRepaintManager;
     
    1615import com.framsticks.remote.RemoteInstance;
    1716import com.framsticks.test.TestConfiguration;
     17import com.framsticks.util.dispatching.Dispatching;
     18import com.framsticks.util.dispatching.JoinableMonitor;
     19// import com.framsticks.util.dispatching.Dispatching;
    1820
    1921import static org.fest.assertions.Assertions.*;
     
    2527        private static final Logger log = Logger.getLogger(BrowserTest.class);
    2628
     29        JoinableMonitor monitor;
    2730        Browser browser;
    2831        Robot robot;
     
    3740
    3841                browser = new Browser();
    39                 browser.configure(new PropertiesConfiguration());
     42                monitor = new JoinableMonitor(browser);
    4043
    4144                RemoteInstance localhost = new RemoteInstance();
     
    4346                localhost.setAddress("localhost:9009");
    4447
    45                 browser.addEndpointForInstance(localhost);
     48                browser.addInstance(localhost);
    4649
    47                 browser.start();
     50                monitor.use();
    4851                // robot.waitForIdle();
    4952                frame = new FrameFixture(robot,
     
    5154                                        @Override
    5255                                        protected JFrame executeInEDT() throws Throwable {
    53                                                 return browser.getMainFrame();
     56                                                return browser.getMainFrame().getSwing();
    5457                                        }
    5558                                }));
     
    8689                clickAndExpandPath(tree, "localhost/simulator/genepools/groups");
    8790                clickAndExpandPath(tree, "localhost/simulator/genepools/groups/Genotypes");
     91
     92
     93
     94
     95
     96
    8897                // tree.clickPath("localhost/simulator/genepools/groups/Genotypes/genotypes");
    8998                // robot.waitForIdle();
     
    97106        }
    98107
    99         public void sleep(int seconds) {
    100                 try {
    101                         Thread.sleep(seconds * 1000, 0);
    102                 } catch (InterruptedException e) {
    103                         e.printStackTrace();
    104                 }
    105         }
    106108
    107109        @AfterClass
    108110        public void tearDown() {
    109                 // frame.close();
    110                 frame.cleanUp();
     111                log.info("before close");
     112
     113                monitor.drop();
     114
     115                Dispatching.joinAbsolutely(browser);
     116                // frame.cleanUp();
     117                // log.info("before close");
     118                // browser.interrupt();
     119
     120                // try {
     121                //      // frame.close();
     122                // } catch (Throwable t) {
     123                //      log.error("caught ", t);
     124                // }
     125                // log.info("after close");
     126                // // frame.close();
     127                // // frame.cleanUp();
     128
     129
     130
     131                // Dispatching.join(browser);
    111132        }
    112133
  • java/main/src/test/java/com/framsticks/params/ParamBuilderTest.java

    r87 r88  
    2020                builderFramsClass = FramsClass.build().forClass(ParamBuilder.class);
    2121
    22                 assertThat(builderFramsClass.getParamCount()).isEqualTo(6);
     22                assertThat(builderFramsClass.getParamCount()).isEqualTo(10);
    2323                assertThat(builderFramsClass.getName()).isEqualTo("prop");
    2424                assertThat(builderFramsClass.getId()).isEqualTo("prop");
  • java/main/src/test/java/com/framsticks/parsers/F0ParserTest.java

    r87 r88  
    55import com.framsticks.model.*;
    66import com.framsticks.model.Package;
     7import com.framsticks.model.f0.Schema;
    78import com.framsticks.params.*;
    89import com.framsticks.params.types.FloatParam;
     
    2930        @BeforeClass
    3031        public void setUp() throws Exception {
    31                 schema = new Schema(Schema.getDefaultDefinitionAsStream());
     32                schema = Schema.load(Schema.getDefaultDefinitionAsStream());
    3233                Package.register(schema.getRegistry());
    3334        }
     
    3536        @Test
    3637        public void primitiveParam() {
    37                 FramsClass joint = schema.getRegistry().getInfoFromCache("j");
     38                FramsClass joint = schema.getFramsClass("j");
    3839                PrimitiveParam<?> dx = joint.getParamEntry("dx", PrimitiveParam.class);
    3940                assertThat(dx).isInstanceOf(FloatParam.class);
     
    4748        @Test
    4849        public void readF0() throws IOException, ParseException {
     50                assertThat(schema.getFramsClass("p")).isInstanceOf(FramsClass.class);
     51                assertThat(schema.getRegistry().getInfoFromCache("p").getParamEntry("as", FloatParam.class).getDef(Double.class)).isEqualTo(0.25, delta(0.0));
     52
    4953                accesses = new F0Parser(schema, F0ParserTest.class.getResourceAsStream("/parsers/f0_example.txt")).parse();
    5054
     
    7579                assertThat(model.getJoints().get(0).part1).isEqualTo(0);
    7680                assertThat(model.getJoints().get(0).part2).isEqualTo(1);
     81                assertThat(model.getNeuroDefs().size()).isEqualTo(6);
    7782                assertThat(model.getNeuroDefs().get(0).part).isEqualTo(1);
    7883                assertThat(model.getNeuroDefs().get(0).joint).isEqualTo(-1);
     
    8994        public void print() throws Exception {
    9095                ListSink sink = new ListSink();
     96
     97
    9198                new F0Writer(schema, model, sink).write();
    9299
  • java/main/src/test/java/com/framsticks/test/TestConfiguration.java

    r84 r88  
    1111
    1212        @BeforeClass
    13         public static void setUpConfiguration() {
     13        public void setUpConfiguration() {
    1414                PropertyConfigurator.configure(TestConfiguration.class.getResource("/log4j.properties"));
    15                 log.info("logging configured");
     15                log.info("testing " + this.getClass());
    1616        }
    1717
  • java/main/src/test/resources/configs/test.xml

    r87 r88  
    11<?xml version="1.0" encoding="UTF-8"?>
    2 <framsticks>
    3         <instance class="com.framsticks.gui.Browser">
    4                 <!-- <size>1500 800</size> -->
    5                 <endpoint class="com.framsticks.remote.RemoteInstance">
    6                         <name>localhost:9009</name>
    7                         <address>localhost:9009</address>
    8                 </endpoint>
    9         </instance>
    10 </framsticks>
     2<Framsticks>
     3        <import class="com.framsticks.gui.Browser" />
     4        <import class="com.framsticks.remote.RemoteInstance" />
     5        <Browser name="browser">
     6                <RemoteInstance name="localhost:9009" address="localhost:9009" />
     7        </Browser>
     8</Framsticks>
  • java/main/src/test/resources/log4j.properties

    r86 r88  
    2727
    2828log4j.logger.com.framsticks=INFO
     29# log4j.logger.com.framsticks.util.dispatching.JoinableMonitor=DEBUG
     30# log4j.logger.com.framsticks.util.dispatching.Dispatching=DEBUG
     31# log4j.logger.com.framsticks.parsers.XmlLoader=DEBUG
    2932# log4j.logger.com.framsticks.parsers.MultiParamLoader=TRACE
    3033# log4j.logger.com.framsticks.gui.controls.SliderControl=TRACE
Note: See TracChangeset for help on using the changeset viewer.