We are taking an incremental approach to adaptive software development in this course: In hw 1 you read and analyzed Java programs, in hw 2 you filled in missing information in Java programs that use DJ, in hw 3 you modified programs that use class dictionaries (similar to XML schemas) and a tiny bit of DemeterJ (the weaving feature offered by Class1 { {{ ... }} } Class2 { {{ ... }} } ... ).
Now in hw 4 you write a simple Java program using DJ and a tiny bit of DemeterJ (the weaving feature) from scratch but you are given the class dictionary.
This homework has two parts: The first part is the Laboratory Guide and the second part is a simple UNIX shell. The Laboratory Guide introduces you to DemeterJ (formerly called Demeter/Java) but most of what you learn will help you to write Java Programs with DJ and a tiny bit of DemeterJ. So when you go through the Laboratory Guide, focus on class dictionaries and how you would express the adaptive programs you encounter directly using DJ without using the adaptive programming language of DemeterJ.
Name substitution throughout Laboratory Guide and other documents: Demeter/Java -> DemeterJ demjava -> demeterj Please note that homework submission is electronic submission to com1205-submission and hardcopy submission. This will allow the teaching assistant to run your programs and mark your printed copies. Please turn in your answers in hardcopy at one of the following places: (1) Bring it to the class room and hand it to me. (2) In 161 Cullinane Hall: Put it into the teaching assistant's mailbox. John Sung's mailbox is about in the center of all the mailboxes. (3) In 161 Cullinane Hall: Put it into my mailbox. (4) If all those possibilities don't work for you, slide it under my office door. For electronic submission, the format for files should be: hw3_[last name].zip you can either use winzip or "zip/unzip" on Unix to package up your files. Please package up your whole directory, but without any .class or .java files. The teaching assistant will be generating them from the DemeterJ files. If you don't follow the above naming rule, points will be taken off because it makes grading and submission difficult.
The class dictionary for DemeterJ which defines the DemeterJ notation. It is reachable from the DemeterJ and AP-Studio resources page: http://www.ccs.neu.edu/research/demeter/DemeterJava/
Plus additional reading as described below.
PURPOSE: See DemeterJ in action. Study an application of the concepts covered so far in the context of a Java application.
Tasks to be done: Read and work through the Laboratory Guide using DemeterJ and hand in all files modified.
Browse through the DemeterJ User's Guide available from the DemeterJ and AP-Studio Resources page http://www.ccs.neu.edu/research/demeter/DemeterJava/. Focus on class dictionaries and only a little bit on the adaptive programming language of DemeterJ.
Browsing the User's Guide will help you to better understand the Laboratory Guide available from the same resource page.
The purpose of this laboratory exercise is to see adaptive programming in operation in the Java world.
Please send mail to com1205-grader@ccs.neu.edu johan@ccs.neu.edu if you find something not clear in the Laboratory Guide.
From a happy user of the Demeter/C++ lab guide. The DemeterJ Laboratory Guide is a translation of the Demeter/C++ Lab Guide.
Hi Crista: I just finished working through the Demeter Lab Guide and already feel a lot more comfortable with Demeter. The Lab Guide is concise, clear and written with a great deal of empathy for the user. Congratulations for doing such an excellent job with the Lab Guide! ...
We simulate a few Operating System file management commands by building our own data structures that represent what the commands do. You are not allowed to use Runtime and Process objects in this homework. Your program should be able to handle inputs like:
mkdir a mkdir b cd a mkdir c mkdir d cd d mkdir x cd .. cp -r d e cd .. echo "before du" du find . -name x -printand produce the same output as UNIX, except that the disk usage command du prints only the file structure and no sizes. More precisely, your program should be able to execute a list of commands as defined by the Extended Backus-Naur-Form (EBNF) grammar below (in Demeter class dictionary notation):
The following misses the part names < ... >. The full cd is here: Full cd in file os.cd. FileSystem = CompoundFile EOF. File : SimpleFile | CompoundFile commonFor the inputFileName. SimpleFile = "simple". CompoundFile = "compound" PList(File). Commands = List(Command) EOF. Command : Simple. Simple : MakeDirectory | ChangeDirectoryUp | ChangeDirectoryDown | RecursiveCopy | DiskUsage | Find | Echo | SymbolicLink | RemoveDirectory | CreateEmptyFile | RemoveFile. MakeDirectory = "mkdir" DirectoryName. ChangeDirectoryUp = "cd ..". ChangeDirectoryDown = "cd" DirectoryName. RecursiveCopy = "cp -r"
mkdir a mkdir b cd a mkdir c mkdir d cd d mkdir x cd .. cp -r d e cd .. echo "before du" du find . -name x -printyour program should produce an output similar to:
before du ./a/c ./a/d/x ./a/d ./a/e/x ./a/e ./a ./b ./ . ./a/d/x ./a/e/xIt is important to do this part in stages. You get full credit if your program works correctly for the sublanguage that includes the commands
Simple = MakeDirectory | ChangeDirectoryUp | ChangeDirectoryDown | DiskUsage | RecursiveCopy | Find | CreateEmptyFile.It is recommended that you start with primitive commands like CreateEmptyFile, MakeDirectory, ChangeDirectoryUp, ChangeDirectoryDown. Hint: Try to use the CopyVisitor of DemeterJ to do the copying: CompoundFile{ traversal toAll(UniversalVisitor) { to *;} public CompoundFile copy() {{ CopyVisitor cv = new CopyVisitor(CompoundFile.class); this.toAll(cv); return (CompoundFile) cv.get_return_val(); }} } For example, for the input:
mkdir a mkdir b cd a mkdir c mkdir d cd .. duyour program should produce the output:
./a/c ./a/d ./a ./bBut you should write your program in such a way that it would be easy to add the rest of the commands. Note that RecursiveCopy, DiskUsage and Find have significant common behavior that you should factor out.
You should focus your efforts on correct inputs as described by the above grammar. It is not important that you give a good error message in case of a syntax error. But your program needs to handle correct inputs correctly.
To represent your file system you may want to use Java classes similar to the ones described below.
FileSystem =CompoundFile EOF. File : SimpleFile | CompoundFile common FileName. SimpleFile = "simple". CompoundFile = "compound" PList(File).
Solution approach: Use the data-binding approach of DemeterJ to generate Java class definitions and parser and pretty printer from a schema (class dictionary).
Start with the DemeterJ program in $SD/hw/4/os-phase1-better and add more behavior files to the program. For illustration purposes, I constructed a FileSystem-object manually and I printed it out with the display method. Use DemeterJ in the limited way as shown in the previous homework: (e.g. in $SD/hw/3/onlyDJ-average-default-list).
A { {{ // in plain Java: // any additional instance variables // any additional methods }} } B { {{ // in plain Java: // any additional instance variables // any additional methods }} } // etc.In the Java methods you use DJ to program adaptively. Note that if a method needs additional instance variables, you may introduce them in your behavior file as shown above. This does not allow you to parse or print those variables. If you need that capability (which is rare), you need to introduce your instance variables in your .cd file.
DO NOT turn in this part! You can check the correct answers yourself. The practice midterm is the midterm from last year. You have more practice exams, including practice finals in the practice exam directory.