Title: CS110 Lecture 18 Tuesday, April 6, 2004
1CS110 Lecture 18Tuesday, April 6, 2004
- Announcements
- hw8 due Thursday, April 8
- pass/fail, withdraw deadline Thursday, April 8
- Agenda
- Questions
- Juno
- JFile system internals
2Juno classes
3Shell
- shell is standard computer science terminology
for an operating systems command line interface - Windows Command Prompt is a shell
- xemacs gives you access to the same shell
- Juno has a shell, presented to a user after she
logs in
4Shell object
- Constructor sets some fields
- the Juno system that created this Shell (37)
(like issuing Bank in BankAccount) - the User and the console (38, 39)
- the current Directory (the Users home) (40)
- Then invokes CLIShell (command line interface)
which works just like LoginInterpreter - get an input line from the user (50)
- invoke this Shells interpret method
- done when interpret returns false for moreWork
(user has typed logout)
5Shell interpret method (60)
- Create a StringTokenizer for the input line,
after throwing away Juno comments ( ) - First token is the commandName (66)
- If its logout, then done (return false)
- Replace if else if with dispatch table
- (70,71) look up commandObject in command table
(commandName String is key) - (76) send commandObject a doIt() message
- Polymorphism!
6Polymorphism poly (many) morph (shape)
- ShellCommandTable.java
- maintains a list of (abstract) ShellCommand
objects - client retrieves them and sends them messages
- without knowing what kinds of JFiles they are!
- Client refers to objects of type Parent that are
really instances of a Child extending Parent - Powerful design tool - ignorance is bliss
7abstract class ShellCommand
- Documentation managed here
- helpString and argstring fields (19, 20)
- initialized by protected constructor (31, 32)
- doIt() method (54)
- abstract public void doIt (
StringTokenizer args, Shell sh ) - doIt is passed the rest of the text on the Juno
command line, and the Shell its acting for - Each concrete ShellCommand implements its own
doIt() - polymorphism
8Designing a ShellCommand object
- MkdirCommand extends ShellCommand (18)
- Constructor (24)
- super invokes ShellCommand constructor, telling
it help string and argument string for mkdir - implement abstract method doIt (37)
- next token on line is the name of the Directory
to be made - tell Directory constructor the name, owner,
parent - public void doIt( StringTokenizer args, Shell sh
) -
- String filename args.nextToken()
- new Directory(filename, sh.getUser(),
sh.getDot())
9ShellCommandTable
- Juno constructor creates a ShellCommandTable
(Juno.java line 52) - ShellCommandTable.java
- declare and initialize a TreeMap (line 23)
- constructor (line 31) invokes fillTable (line 69)
- fillTable creates one of each concrete
ShellCommand objects, invokes install (line 61)
to put it in the table - client (a Shell) invokes lookup (43), which wraps
Map get method (and does the cast)
10How the dispatch table works (reprise)
- In CLIShell loop
- get first token on the line commandName
- lookup commandObject with commandName key
- send doIt() message
- Each particular ShellCommand extends the abstract
ShellCommand class, implementing doIt() in its
own way - Polymorphism at work
11How LoginInterpreter interpret works (reprise)
- get first token on the line
- use if - else if - else if logic
- if exit return false! // leave loop in
CLIlogin - if register // create account for new
user - if help // give help
- else // input is a username
12Dispatch table vs if-else if-else if
- To add new commands just add a table entry
- Command semantics separate from syntax
- Lots of design overhead, hard to understand
- Good for large command sets that will grow
(Juno shell commands)
- To add new commands must edit the main loop
- Command semantics and syntax in same place
- Quick and dirty, easy to understand and code
- Good for small command sets that stay put
(Juno login loop)
13JFile system uses two trees
Java class hierarchy
Juno Directory and TextFile hierarchy
\ users\ eb\ backup\
Foo.java memo.txt bill\
class Object
class JFile
class Directory
class TextFile
14JFile (easy part)
- private fields for
- String name Date createDate
- User owner Date modDate
- getters and setters as appropriate
- abstract getSize method since each child must
provide its own implementation - number of JFiles in a Directory
- number of characters in a TextFile
15Testing JFile, Directory, TextFile
- JFile version 5 (before Juno) has static code for
testing JFile and its subclasses - We didnt study it
- Best way to test these classes as a part of Juno
is to write Juno commands - type to test newfile (done)
- cd and list to test mkdir (done for Juno 7)
- Read CdCommand
- hw9 improve the ListCommand we will provide
16JFiles in Juno
- Directory constructor signature
(String directoryName, User owner,
Directory parent) - User constructor signature
(String loginName, Directory home,
String realName) - Circular reference problem needs solving
17Set up Juno file system
(Juno.java 56-60)
- // create root directory
- slash new Directory( "", null, null )
- // create system administrator (a User)
- User root new User
( "root", slash, "Rick Martin" ) - // add system administrator to user table
- users.put( "root", root )
- // system administrator owns his home
- slash.setOwner(root)
- // create Directory for regular user homes
- userHomes new Directory ( "users", root,
slash )
18Home Directory
- Each User has a home directory, in users, created
when User is created
(LoginInterpreter register method, line 100) - Any user can read or write in any other users
home directory
19Managing the JFile tree
- A Directory
- keeps a TreeMap of JFiles in its jfile field,
keyed by name - has methods to add and retrieve JFiles by name
- has a method that allows client to loop on
contents - A JFile has a parent field (line 37) in which it
keeps a reference to the Directory it lives in
(like BankAccount Bank)
20JFile constructor
- JFile.java, line 49
- protected visible to children, not public
- lines 51-52 are easy they initialize fields
- if (parent ! null) (line 53)
- parent.addJFile( name, this )
- if this JFile has a parent (not top of JFile
tree) send message to parent to add this JFile
(Directory or TextFile) to its TreeMap,
with name as key. (Directory.java
line 67) - Careful parent directory ! parent class
21Current Directory
- When a Juno user logs in, the current Directory
is her home Directory - Convention (in the world of shells)
- . signifies the current Directory
- .. signifies its parent
- Juno Shell provides getDot and setDot methods
22cd
- Syntax
- cd change to home directory
- cd foo change to subdirectory foo
- cd . stay where you are
- cd .. change to parent of current directory
- cd ..\bar\whatever not supported in Juno
23doIt() in CdCommand class
- String dirname ""
- Directory d sh.getUser().getHome()
- if ( args.hasMoreTokens() )
- dirname args.nextToken()
- if (dirname.equals(".."))
- if (sh.getDot().isRoot())
- d sh.getDot() // no change
- else
- d sh.getDot().getParent()
-
- else if (dirname.equals("."))
- d sh.getDot() // no change
- else
- d (Directory)sh.getDot().
- retrieveJFile(dirname))
-
- sh.setDot( d )
24JFile getSuffix
\ users\ eb\ backup\
Foo.java memo.txt bill\
- A unix/linux tradition
appends a / when listing
the
name of a Directory - We want JFiles to behave
this way, but to use the
windows \ instead - Ask a JFile to tell you its suffix
by sending it a
getSuffix message - getSuffix is abstract in JFile.java
25\ vs /
- Windows uses one, Unix the other
- Java knows about both
- File.java (in the Java API) declares
public static final String separator - JFile.java declares
public static String separator
File.separator
26dir (windows)
full path name in shell prompt
directories first, including . and ..
file, directory and character counts, including .
and ..
27list (Juno)
full path name in shell prompt
- mars\users\eb list
- Directory of \users\eb
- 04/05/2004 0834 AM .
- 04/05/2004 0834 AM ..
- 04/05/2004 0831 AM 2 backup\
- 04/05/2004 0833 AM 13 Foo.java
- 04/05/2004 0832 AM 17 memo.txt
- 2 File(s) 30 bytes
- 3 Dir(s)
file, directory and character counts, including .
and ..
28getPathName (JFile line 77)
- public String getPathName()
- if (this.isRoot())
- return separator
-
- if (parent.isRoot())
- return separator getName()
-
- return parent.getPathName()
- separator getName()
-
29Boxes and arrows
30Formatting