Changeset 6


Ignore:
Timestamp:
09/21/2005 10:00:46 PM (16 years ago)
Author:
dsowen
Message:

Split out the access stuff into accesslib.
New Creator interface off-loads object creation to user.

Location:
trunk
Files:
7 added
3 deleted
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/project.xml

    r5 r6  
    7070    </unitTest>
    7171  </build>
     72  <dependencies>
     73    <dependency>
     74      <groupId>accesslib</groupId>
     75      <artifactId>accesslib</artifactId>
     76      <version>SNAPSHOT</version>
     77    </dependency>
     78  </dependencies>
    7279</project>
  • trunk/src/ws/fugue88/jpath/BrokenGraphException.java

    r4 r6  
    33 *
    44 * $Log$
     5 * Revision 1.2  2005/09/21 22:00:45  dsowen
     6 * Split out the access stuff into accesslib.
     7 * New Creator interface off-loads object creation to user.
     8 *
    59 * Revision 1.1  2005/08/12 19:01:46  dsowen
    610 * Feature: can automatically fill missing parts of a graph.
     
    1418public class BrokenGraphException extends Exception {
    1519
     20        public BrokenGraphException(final Context context, final Path path,
     21                        final Object parent, final PathPart child)
     22        {
     23                super("Graph broken for path '" + child + "' on object {" + parent
     24                                + "}, accessed from context " + context + " at '" + path + "'.");
     25
     26                _context = context;
     27                _path = path;
     28                _parent = parent;
     29                _child = child;
     30        }
     31
     32        private final Context _context;
     33        private final Path _path;
     34        private final Object _parent;
     35        private final PathPart _child;
    1636}
  • trunk/src/ws/fugue88/jpath/Context.java

    r5 r6  
    33 *
    44 * $Log$
     5 * Revision 1.4  2005/09/21 22:00:45  dsowen
     6 * Split out the access stuff into accesslib.
     7 * New Creator interface off-loads object creation to user.
     8 *
    59 * Revision 1.3  2005/08/19 17:51:17  dsowen
    610 * Fixed: NPEs when using accessors from paths, &c.  Included tests.
     
    2832import java.util.Map;
    2933
     34import ws.fugue88.access.Accessor;
     35import ws.fugue88.access.ListAccessor;
     36import ws.fugue88.access.MapAccessor;
     37
    3038/**
    3139 * @author dsowen
     
    4048                Context current = this;
    4149                for(Iterator i = path.parents().iterator(); i.hasNext();) {
    42                         Accessor accessor = current.getTargetAccessor((PathPart)i.next());
     50                        final PathPart part = (PathPart)i.next();
     51                        Accessor accessor = current.getTargetAccessor(part);
    4352                        Object obj = accessor.getValue();
    44                         if(obj == null) {
    45                                 if(_modifying) {
    46                                         obj = createBlank(accessor.getType());
    47                                         accessor.setValue(obj);
    48                                 } else {
    49                                         throw new BrokenGraphException();
    50                                 }
    51                         }
    52                         current = new Context(obj, _binder, _modifying);
     53                        if(obj == null)
     54                                        obj = _creator.create(accessor.getType(), current._root,
     55                                                        part);
     56                        if(obj == null)
     57                                        throw new BrokenGraphException(this, path, current._root,
     58                                                        part);
     59
     60                        accessor.setValue(obj);
     61                        current = new Context(obj, _binder, _creator);
    5362                }
    5463                return current.getTargetAccessor(path.terminal());
     
    7180        {
    7281                Object child = getTarget(path);
    73                 return new Context(child, _binder, _modifying);
     82                return new Context(child, _binder, _creator);
    7483        }
    7584
     
    7988        }
    8089
    81         Context(final Object root, final Binder binder, final boolean modifying)
     90        Context(final Object root, final Binder binder, final GraphCreator creator)
    8291        {
    8392                // NPEs
    8493                root.getClass();
    8594                binder.getClass();
     95                creator.getClass();
    8696
    8797                _root = root;
    8898                _binder = binder;
    89                 _modifying = modifying;
     99                _creator = creator;
    90100        }
    91101
     
    127137        private final Object _root;
    128138        private final Binder _binder;
    129         private final boolean _modifying;
     139        private final GraphCreator _creator;
    130140}
  • trunk/src/ws/fugue88/jpath/ContextFactory.java

    r4 r6  
    33 *
    44 * $Log$
     5 * Revision 1.3  2005/09/21 22:00:45  dsowen
     6 * Split out the access stuff into accesslib.
     7 * New Creator interface off-loads object creation to user.
     8 *
    59 * Revision 1.2  2005/08/12 19:01:46  dsowen
    610 * Feature: can automatically fill missing parts of a graph.
     
    1721public class ContextFactory {
    1822
    19         public Context createContext(final Object root)
     23        public Context createContext(final Object root, final GraphCreator creator)
    2024        {
    21                 return new Context(root, _binder, false);
    22         }
    23 
    24         public Context createModifyingContext(final Object root)
    25         {
    26                 return new Context(root, _binder, true);
     25                return new Context(root, _binder, creator);
    2726        }
    2827
  • trunk/src/ws/fugue88/jpath/Identifier.java

    r2 r6  
    33 *
    44 * $Log$
     5 * Revision 1.2  2005/09/21 22:00:46  dsowen
     6 * Split out the access stuff into accesslib.
     7 * New Creator interface off-loads object creation to user.
     8 *
    59 * Revision 1.1  2005/08/03 00:35:29  dsowen
    610 * Initial commit.
     
    2428        }
    2529
     30        public String toString()
     31        {
     32                return "/" + _name;
     33        }
     34
    2635        private final String _name;
    2736}
  • trunk/src/ws/fugue88/jpath/NumberSelector.java

    r2 r6  
    33 *
    44 * $Log$
     5 * Revision 1.2  2005/09/21 22:00:45  dsowen
     6 * Split out the access stuff into accesslib.
     7 * New Creator interface off-loads object creation to user.
     8 *
    59 * Revision 1.1  2005/08/03 00:35:29  dsowen
    610 * Initial commit.
     
    2933        }
    3034
     35        public String toString()
     36        {
     37                return "[" + _number + "]";
     38        }
     39
    3140        private final Integer _number;
    3241}
  • trunk/src/ws/fugue88/jpath/Path.java

    r5 r6  
    33 *
    44 * $Log$
     5 * Revision 1.3  2005/09/21 22:00:45  dsowen
     6 * Split out the access stuff into accesslib.
     7 * New Creator interface off-loads object creation to user.
     8 *
    59 * Revision 1.2  2005/08/19 17:51:17  dsowen
    610 * Fixed: NPEs when using accessors from paths, &c.  Included tests.
     
    1620package ws.fugue88.jpath;
    1721
    18 import java.nio.CharBuffer;
    19 import java.text.ParseException;
    2022import java.util.Collections;
    2123import java.util.Iterator;
    22 import java.util.LinkedList;
    2324import java.util.List;
    24 import java.util.regex.Matcher;
    25 import java.util.regex.Pattern;
    2625
    2726/**
     
    3029public class Path {
    3130
    32         public static String quote(final String s)
     31        Path(final List parts)
    3332        {
    34                 return s.replaceAll("'", "\\\\'");
    35         }
    36 
    37         public static String unquote(final String s)
    38         {
    39                 return s.replaceAll("\\\\'", "'");
    40         }
    41 
    42         public Path(final String path) throws ParseException
    43         {
    44                 _parts = new LinkedList();
    45 
    46                 CharSequence buff = CharBuffer.wrap(path);
    47                 do {
    48                         Matcher m;
    49                         final PathPart pp;
    50                         if((m = IDENT.matcher(buff)).find()) {
    51                                 pp = new Identifier(m.group(1));
    52                         } else if((m = NUM_SEL.matcher(buff)).find()) {
    53                                 pp = new NumberSelector(m.group(1));
    54                         } else if((m = STR_SEL.matcher(buff)).find()) {
    55                                 pp = new StringSelector(unquote(m.group(1)));
    56                         } else {
    57                                 throw new ParseException(
    58                                                 "Expected identifier or selector, found '"
    59                                                                 + (buff.length() > 40 ? buff.subSequence(0, 37)
    60                                                                                 + "..." : buff) + "'.", -1);
    61                         }
    62                         _parts.add(pp);
    63                         buff = buff.subSequence(m.end(), buff.length());
    64                 } while(buff.length() > 0);
     33                _parts = parts;
    6534        }
    6635
     
    6837        {
    6938                return new Path(_parts.subList(0, _parts.size() - 1));
     39        }
     40
     41        public Path children()
     42        {
     43                return new Path(_parts.subList(1, _parts.size()));
     44        }
     45
     46        public PathPart head()
     47        {
     48                return (PathPart)_parts.get(0);
    7049        }
    7150
     
    8059        }
    8160
    82         protected Path(final List list)
     61        public boolean isEmpty()
    8362        {
    84                 _parts = list;
     63                return _parts.isEmpty();
     64        }
     65
     66        public String toString()
     67        {
     68                final StringBuffer buff = new StringBuffer();
     69                for(final Iterator i = _parts.iterator(); i.hasNext();) {
     70                        buff.append(i.next());
     71                }
     72                return buff.toString();
    8573        }
    8674
    8775        private final List _parts;
    88 
    89         private static final String IDENT_START = "A-Za-z_";
    90         private static final String IDENT_END = IDENT_START + "0-9";
    91         private static final Pattern IDENT = Pattern.compile("^/([" + IDENT_START
    92                         + "][" + IDENT_END + "]*)");
    93 
    94         private static final String NUM_LIT = "-?[0-9]+";
    95         private static final Pattern NUM_SEL = Pattern.compile("^\\[(" + NUM_LIT
    96                         + ")\\]");
    97 
    98         private static final String STR_LIT = "'((?:[^']|\\\\')*)'";
    99         private static final Pattern STR_SEL = Pattern.compile("^\\[" + STR_LIT
    100                         + "\\]");
    10176}
  • trunk/src/ws/fugue88/jpath/PathPart.java

    r2 r6  
    33 *
    44 * $Log$
     5 * Revision 1.2  2005/09/21 22:00:45  dsowen
     6 * Split out the access stuff into accesslib.
     7 * New Creator interface off-loads object creation to user.
     8 *
    59 * Revision 1.1  2005/08/03 00:35:29  dsowen
    610 * Initial commit.
     
    1216 * @author dsowen
    1317 */
    14 public class PathPart {
     18public abstract class PathPart {
     19
     20        public abstract String toString();
    1521}
  • trunk/src/ws/fugue88/jpath/PropertyAccessor.java

    r2 r6  
    33 *
    44 * $Log$
     5 * Revision 1.2  2005/09/21 22:00:45  dsowen
     6 * Split out the access stuff into accesslib.
     7 * New Creator interface off-loads object creation to user.
     8 *
    59 * Revision 1.1  2005/08/03 00:35:29  dsowen
    610 * Initial commit.
     
    1014
    1115import java.lang.reflect.InvocationTargetException;
     16
     17import ws.fugue88.access.Accessor;
    1218
    1319/**
     
    1925        {
    2026                return _prop.getType();
     27        }
     28
     29        public void clearValue() throws InvocationTargetException
     30        {
     31                _prop.setValue(_that, null);
    2132        }
    2233
  • trunk/src/ws/fugue88/jpath/StringSelector.java

    r2 r6  
    33 *
    44 * $Log$
     5 * Revision 1.2  2005/09/21 22:00:45  dsowen
     6 * Split out the access stuff into accesslib.
     7 * New Creator interface off-loads object creation to user.
     8 *
    59 * Revision 1.1  2005/08/03 00:35:29  dsowen
    610 * Initial commit.
     
    2428        }
    2529
     30        public String toString()
     31        {
     32                return "['" + PathParser.quote(_str) + "']";
     33        }
     34
    2635        private final String _str;
    2736}
  • trunk/testsrc/ws/fugue88/ContextTest.java

    r5 r6  
    33 *
    44 * $Log$
     5 * Revision 1.2  2005/09/21 22:00:46  dsowen
     6 * Split out the access stuff into accesslib.
     7 * New Creator interface off-loads object creation to user.
     8 *
    59 * Revision 1.1  2005/08/19 17:51:17  dsowen
    610 * Fixed: NPEs when using accessors from paths, &c.  Included tests.
     
    1923
    2024import junit.framework.TestCase;
    21 import ws.fugue88.jpath.Accessor;
     25import ws.fugue88.access.Accessor;
    2226import ws.fugue88.jpath.Context;
    2327import ws.fugue88.jpath.ContextFactory;
    24 import ws.fugue88.jpath.Path;
     28import ws.fugue88.jpath.GraphCreator;
     29import ws.fugue88.jpath.SimplePathParser;
    2530
    2631/**
     
    3843
    3944                ContextFactory factory = new ContextFactory();
    40                 Context context = factory.createContext(a);
    41                 assertSame(a.b, context.getTarget(new Path("/b")));
    42 
    43                 Accessor accessor = context.getTargetAccessor(new Path("/b"));
     45                Context context = factory.createContext(a, GraphCreator.NULL);
     46                assertSame(a.b, context.getTarget(new SimplePathParser().parse("/b")));
     47
     48                Accessor accessor = context.getTargetAccessor(new SimplePathParser().parse("/b"));
    4449                assertSame(a.b, accessor.getValue());
    4550                accessor.setValue("done");
     
    6065
    6166                ContextFactory factory = new ContextFactory();
    62                 Context context = factory.createContext(a);
    63                 assertEquals("test", context.getTarget(new Path("/b")));
     67                Context context = factory.createContext(a, GraphCreator.NULL);
     68                assertEquals("test",
     69                                context.getTarget(new SimplePathParser().parse("/b")));
    6470                try {
    65                         context.getTargetAccessor(new Path("/b")).setValue("done");
     71                        context.getTargetAccessor(new SimplePathParser().parse("/b")).setValue(
     72                                        "done");
    6673                        assertTrue(false);
    6774                } catch(UnsupportedOperationException e) {}
     
    8794
    8895                ContextFactory factory = new ContextFactory();
    89                 Context context = factory.createContext(a);
    90                 assertEquals("test", context.getTarget(new Path("/b")));
    91                 context.getTargetAccessor(new Path("/b")).setValue("done");
     96                Context context = factory.createContext(a, GraphCreator.NULL);
     97                assertEquals("test",
     98                                context.getTarget(new SimplePathParser().parse("/b")));
     99                context.getTargetAccessor(new SimplePathParser().parse("/b")).setValue(
     100                                "done");
    92101                assertEquals("done", a.getB());
    93102        }
     
    107116
    108117                ContextFactory factory = new ContextFactory();
    109                 Context context = factory.createContext(a);
    110                 assertEquals("test", context.getTarget(new Path("/b['c']")));
    111                 context.getTargetAccessor(new Path("/b['c']")).setValue("done");
     118                Context context = factory.createContext(a, GraphCreator.NULL);
     119                assertEquals("test",
     120                                context.getTarget(new SimplePathParser().parse("/b['c']")));
     121                context.getTargetAccessor(new SimplePathParser().parse("/b['c']")).setValue(
     122                                "done");
    112123                assertEquals("done", a.b.get("c"));
    113124        }
     
    126137
    127138                ContextFactory factory = new ContextFactory();
    128                 Context context = factory.createContext(b);
    129                 assertNull(context.getTarget(new Path("/a/s")));
     139                Context context = factory.createContext(b, GraphCreator.NULL);
     140                assertNull(context.getTarget(new SimplePathParser().parse("/a/s")));
    130141                assertNull(b.a);
    131142        }
     
    145156
    146157                ContextFactory factory = new ContextFactory();
    147                 Context context = factory.createModifyingContext(b);
    148                 assertNull(context.getTarget(new Path("/a/s")));
     158                Context context = factory.createContext(b, GraphCreator.DEFAULT);
     159                assertNull(context.getTarget(new SimplePathParser().parse("/a/s")));
    149160                assertNotNull(b.a);
    150161                assertNull(b.a.s);
     
    160171
    161172                ContextFactory factory = new ContextFactory();
    162                 Context context = factory.createModifyingContext(b);
    163                 Accessor accessor = context.getTargetAccessor(new Path("/a/s"));
     173                Context context = factory.createContext(b, GraphCreator.DEFAULT);
     174                Accessor accessor = context.getTargetAccessor(new SimplePathParser().parse("/a/s"));
    164175                assertNotNull(b.a);
    165176                assertNull(b.a.s);
     
    184195
    185196                ContextFactory factory = new ContextFactory();
    186                 Context context = factory.createModifyingContext(b);
    187                 assertNull(context.getTarget(new Path("/x/s")));
     197                Context context = factory.createContext(b, GraphCreator.DEFAULT);
     198                assertNull(context.getTarget(new SimplePathParser().parse("/x/s")));
    188199                assertNotNull(b.x);
    189200                assertNull(b.x.s);
  • trunk/testsrc/ws/fugue88/jpath/PathTest.java

    r2 r6  
    33 *
    44 * $Log$
     5 * Revision 1.2  2005/09/21 22:00:46  dsowen
     6 * Split out the access stuff into accesslib.
     7 * New Creator interface off-loads object creation to user.
     8 *
    59 * Revision 1.1  2005/08/03 00:35:29  dsowen
    610 * Initial commit.
     
    2024        public void testQuote()
    2125        {
    22                 assertEquals("test", Path.quote("test"));
    23                 assertEquals("te\\'st", Path.quote("te'st"));
     26                assertEquals("test", PathParser.quote("test"));
     27                assertEquals("te\\'st", PathParser.quote("te'st"));
    2428        }
    2529
    2630        public void testIdentifier() throws Exception
    2731        {
    28                 Path path = new Path("/test");
     32                Path path = new SimplePathParser().parse("/test");
    2933                Iterator i = path.iterator();
    3034                PathPart part = (PathPart)i.next();
     
    3640        public void testNumberSelector() throws Exception
    3741        {
    38                 Path path = new Path("[0]");
     42                Path path = new SimplePathParser().parse("[0]");
    3943                Iterator i = path.iterator();
    4044                PathPart part = (PathPart)i.next();
     
    4650        public void testStringSelectorSimple() throws Exception
    4751        {
    48                 Path path = new Path("['test']");
     52                Path path = new SimplePathParser().parse("['test']");
    4953                Iterator i = path.iterator();
    5054                PathPart part = (PathPart)i.next();
     
    5660        public void testStringSelectorQuoted() throws Exception
    5761        {
    58                 Path path = new Path("['te\\'st']");
     62                Path path = new SimplePathParser().parse("['te\\'st']");
    5963                Iterator i = path.iterator();
    6064                PathPart part = (PathPart)i.next();
     
    6367                assertFalse(i.hasNext());
    6468        }
     69
    6570        public void testCompound1() throws Exception
    6671        {
    67                 Path path = new Path("/a/b");
     72                Path path = new SimplePathParser().parse("/a/b");
    6873                Iterator i = path.iterator();
    6974                PathPart part = (PathPart)i.next();
Note: See TracChangeset for help on using the changeset viewer.