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?.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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}
Note: See TracChangeset for help on using the changeset viewer.