diff options
author | Jose <jose@zeroc.com> | 2014-11-07 21:28:00 +0100 |
---|---|---|
committer | Jose <jose@zeroc.com> | 2014-11-07 21:28:00 +0100 |
commit | f99742d525f519996a6d321afb323a67fd9be4f9 (patch) | |
tree | f7b4454611d64d1a28bf9609aa64234fe78d3f53 /java/demo/Manual/evictor_filesystem | |
parent | Some IceJS linting fixes (diff) | |
download | ice-f99742d525f519996a6d321afb323a67fd9be4f9.tar.bz2 ice-f99742d525f519996a6d321afb323a67fd9be4f9.tar.xz ice-f99742d525f519996a6d321afb323a67fd9be4f9.zip |
Fix for (ICE-5832) Versioning of Jar files
Renaming JAR files
Diffstat (limited to 'java/demo/Manual/evictor_filesystem')
18 files changed, 1559 insertions, 0 deletions
diff --git a/java/demo/Manual/evictor_filesystem/.externalToolBuilders/book.demo.evictor_filesystem.slice.launch b/java/demo/Manual/evictor_filesystem/.externalToolBuilders/book.demo.evictor_filesystem.slice.launch new file mode 100644 index 00000000000..0ce604434d2 --- /dev/null +++ b/java/demo/Manual/evictor_filesystem/.externalToolBuilders/book.demo.evictor_filesystem.slice.launch @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<launchConfiguration type="org.eclipse.ant.AntBuilderLaunchConfigurationType"> +<stringAttribute key="org.eclipse.ant.ui.ATTR_ANT_AUTO_TARGETS" value="generate,"/> +<stringAttribute key="org.eclipse.ant.ui.ATTR_ANT_CLEAN_TARGETS" value="clean,"/> +<stringAttribute key="org.eclipse.ant.ui.ATTR_ANT_MANUAL_TARGETS" value="generate,"/> +<booleanAttribute key="org.eclipse.ant.ui.ATTR_TARGETS_UPDATED" value="true"/> +<booleanAttribute key="org.eclipse.ant.ui.DEFAULT_VM_INSTALL" value="false"/> +<stringAttribute key="org.eclipse.debug.core.ATTR_REFRESH_SCOPE" value="${container}"/> +<booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="false"/> +<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.ant.ui.AntClasspathProvider"/> +<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="true"/> +<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="demo.book.evictor_filesystem"/> +<stringAttribute key="org.eclipse.ui.externaltools.ATTR_BUILD_SCOPE" value="${working_set:<?xml version="1.0" encoding="UTF-8"?> <resources> <item path="/demo.book.evictor_filesystem/Filesystem.ice" type="1"/> <item path="/demo.book.evictor_filesystem/PersistentFilesystem.ice" type="1"/> </resources>}"/> +<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${workspace_loc:/demo.book.evictor_filesystem/build.xml}"/> +<stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="incremental,auto,clean"/> +<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/> +</launchConfiguration> diff --git a/java/demo/Manual/evictor_filesystem/.gitignore b/java/demo/Manual/evictor_filesystem/.gitignore new file mode 100644 index 00000000000..9c39416c539 --- /dev/null +++ b/java/demo/Manual/evictor_filesystem/.gitignore @@ -0,0 +1 @@ +db/* diff --git a/java/demo/Manual/evictor_filesystem/Client.java b/java/demo/Manual/evictor_filesystem/Client.java new file mode 100644 index 00000000000..93a48deb2b5 --- /dev/null +++ b/java/demo/Manual/evictor_filesystem/Client.java @@ -0,0 +1,50 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +import Filesystem.*; + +public class Client extends Ice.Application +{ + @Override + public int + run(String[] args) + { + // + // Terminate cleanly on receipt of a signal. + // + shutdownOnInterrupt(); + + // + // Create a proxy for the root directory + // + DirectoryPrx rootDir = DirectoryPrxHelper.checkedCast(communicator().propertyToProxy("RootDir.Proxy")); + if(rootDir == null) + { + throw new Error("Client: invalid proxy"); + } + + Parser p = new Parser(rootDir); + return p.parse(); + } + + static public void + main(String[] args) + { + Client app = new Client(); + app.main("demo.book.evictor_filesystem.Client", args, "config.client"); + } + + static private class Error extends RuntimeException + { + public Error(String msg) + { + super(msg); + } + } +} diff --git a/java/demo/Manual/evictor_filesystem/DirectoryI.java b/java/demo/Manual/evictor_filesystem/DirectoryI.java new file mode 100644 index 00000000000..73074c8b5ec --- /dev/null +++ b/java/demo/Manual/evictor_filesystem/DirectoryI.java @@ -0,0 +1,170 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +import Filesystem.*; + +public final class DirectoryI extends PersistentDirectory +{ + public + DirectoryI() + { + _destroyed = false; + nodes = new java.util.HashMap<java.lang.String, NodeDesc>(); + } + + @Override + public synchronized String + name(Ice.Current current) + { + if(_destroyed) + { + throw new Ice.ObjectNotExistException(current.id, current.facet, current.operation); + } + + return nodeName; + } + + @Override + public void + destroy(Ice.Current current) + throws PermissionDenied + { + if(parent == null) + { + throw new PermissionDenied("Cannot destroy root directory"); + } + + synchronized(this) + { + if(_destroyed) + { + throw new Ice.ObjectNotExistException(current.id, current.facet, current.operation); + } + if(!nodes.isEmpty()) + { + throw new PermissionDenied("Cannot destroy non-empty directory"); + } + _destroyed = true; + } + + // + // Because we use a transactional evictor, these updates are guaranteed to be atomic. + // + parent.removeNode(nodeName); + _evictor.remove(current.id); + } + + @Override + public synchronized NodeDesc[] + list(Ice.Current current) + { + if(_destroyed) + { + throw new Ice.ObjectNotExistException(current.id, current.facet, current.operation); + } + + NodeDesc[] result = new NodeDesc[nodes.size()]; + int i = 0; + java.util.Iterator<NodeDesc> p = nodes.values().iterator(); + while(p.hasNext()) + { + result[i++] = p.next(); + } + return result; + } + + @Override + public synchronized NodeDesc + find(String name, Ice.Current current) + throws NoSuchName + { + if(_destroyed) + { + throw new Ice.ObjectNotExistException(current.id, current.facet, current.operation); + } + + if(!nodes.containsKey(name)) + { + throw new NoSuchName(name); + } + + return nodes.get(name); + } + + @Override + public synchronized DirectoryPrx + createDirectory(String name, Ice.Current current) + throws NameInUse + { + if(_destroyed) + { + throw new Ice.ObjectNotExistException(current.id, current.facet, current.operation); + } + + if(name.length() == 0 || nodes.containsKey(name)) + { + throw new NameInUse(name); + } + + Ice.Identity id = current.adapter.getCommunicator().stringToIdentity(java.util.UUID.randomUUID().toString()); + PersistentDirectory dir = new DirectoryI(); + dir.nodeName = name; + dir.parent = PersistentDirectoryPrxHelper.uncheckedCast(current.adapter.createProxy(current.id)); + DirectoryPrx proxy = DirectoryPrxHelper.uncheckedCast(_evictor.add(dir, id)); + + NodeDesc nd = new NodeDesc(); + nd.name = name; + nd.type = NodeType.DirType; + nd.proxy = proxy; + nodes.put(name, nd); + + return proxy; + } + + @Override + public synchronized FilePrx + createFile(String name, Ice.Current current) + throws NameInUse + { + if(_destroyed) + { + throw new Ice.ObjectNotExistException(current.id, current.facet, current.operation); + } + + if(name.length() == 0 || nodes.containsKey(name)) + { + throw new NameInUse(name); + } + + Ice.Identity id = current.adapter.getCommunicator().stringToIdentity(java.util.UUID.randomUUID().toString()); + PersistentFile file = new FileI(); + file.nodeName = name; + file.parent = PersistentDirectoryPrxHelper.uncheckedCast(current.adapter.createProxy(current.id)); + FilePrx proxy = FilePrxHelper.uncheckedCast(_evictor.add(file, id)); + + NodeDesc nd = new NodeDesc(); + nd.name = name; + nd.type = NodeType.FileType; + nd.proxy = proxy; + nodes.put(name, nd); + + return proxy; + } + + @Override + public synchronized void + removeNode(String name, Ice.Current current) + { + assert(nodes.containsKey(name)); + nodes.remove(name); + } + + public static Freeze.Evictor _evictor; + private boolean _destroyed; +} diff --git a/java/demo/Manual/evictor_filesystem/FileI.java b/java/demo/Manual/evictor_filesystem/FileI.java new file mode 100644 index 00000000000..f8904d52490 --- /dev/null +++ b/java/demo/Manual/evictor_filesystem/FileI.java @@ -0,0 +1,80 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +import Filesystem.*; + +public final class FileI extends PersistentFile +{ + public + FileI() + { + _destroyed = false; + } + + @Override + public synchronized String + name(Ice.Current current) + { + if(_destroyed) + { + throw new Ice.ObjectNotExistException(current.id, current.facet, current.operation); + } + + return nodeName; + } + + @Override + public void + destroy(Ice.Current current) + throws PermissionDenied + { + synchronized(this) + { + if(_destroyed) + { + throw new Ice.ObjectNotExistException(current.id, current.facet, current.operation); + } + _destroyed = true; + } + + // + // Because we use a transactional evictor, these updates are guaranteed to be atomic. + // + parent.removeNode(nodeName); + _evictor.remove(current.id); + } + + @Override + public synchronized String[] + read(Ice.Current current) + { + if(_destroyed) + { + throw new Ice.ObjectNotExistException(current.id, current.facet, current.operation); + } + + return text.clone(); + } + + @Override + public synchronized void + write(String[] text, Ice.Current current) + throws GenericError + { + if(_destroyed) + { + throw new Ice.ObjectNotExistException(current.id, current.facet, current.operation); + } + + this.text = text; + } + + public static Freeze.Evictor _evictor; + private boolean _destroyed; +} diff --git a/java/demo/Manual/evictor_filesystem/Filesystem.ice b/java/demo/Manual/evictor_filesystem/Filesystem.ice new file mode 100644 index 00000000000..bb84720f462 --- /dev/null +++ b/java/demo/Manual/evictor_filesystem/Filesystem.ice @@ -0,0 +1,63 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +#pragma once + +module Filesystem +{ + exception GenericError + { + string reason; + }; + exception PermissionDenied extends GenericError {}; + exception NameInUse extends GenericError {}; + exception NoSuchName extends GenericError {}; + + interface Node + { + idempotent string name(); + + ["freeze:write"] + void destroy() throws PermissionDenied; + }; + + sequence<string> Lines; + + interface File extends Node + { + idempotent Lines read(); + + ["freeze:write"] + idempotent void write(Lines text) throws GenericError; + }; + + enum NodeType { DirType, FileType }; + + struct NodeDesc + { + string name; + NodeType type; + Node* proxy; + }; + + sequence<NodeDesc> NodeDescSeq; + + interface Directory extends Node + { + idempotent NodeDescSeq list(); + + idempotent NodeDesc find(string name) throws NoSuchName; + + ["freeze:write"] + File* createFile(string name) throws NameInUse; + + ["freeze:write"] + Directory* createDirectory(string name) throws NameInUse; + }; +}; diff --git a/java/demo/Manual/evictor_filesystem/Grammar.java b/java/demo/Manual/evictor_filesystem/Grammar.java new file mode 100644 index 00000000000..16234c61ea5 --- /dev/null +++ b/java/demo/Manual/evictor_filesystem/Grammar.java @@ -0,0 +1,202 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +class Grammar +{ + Grammar(Parser p) + { + _parser = p; + _scanner = new Scanner(_parser); + } + + void + parse() + { + while(true) + { + try + { + _token = _scanner.nextToken(); + if(_token == null) + { + return; + } + else if(_token.type == Token.TOK_SEMI) + { + // Continue + } + else if(_token.type == Token.TOK_HELP) + { + _token = _scanner.nextToken(); + if(_token.type != Token.TOK_SEMI) + { + throw new ParseError("Expected ';'"); + } + _parser.usage(); + } + else if(_token.type == Token.TOK_EXIT) + { + _token = _scanner.nextToken(); + if(_token.type != Token.TOK_SEMI) + { + throw new ParseError("Expected ';'"); + } + return; + } + else if(_token.type == Token.TOK_LIST) + { + _token = _scanner.nextToken(); + if(_token.type != Token.TOK_SEMI) + { + throw new ParseError("Expected ';'"); + } + _parser.list(false); + } + else if(_token.type == Token.TOK_LIST_RECURSIVE) + { + _token = _scanner.nextToken(); + if(_token.type != Token.TOK_SEMI) + { + throw new ParseError("Expected ';'"); + } + _parser.list(true); + } + else if(_token.type == Token.TOK_CREATE_FILE) + { + java.util.List<String> s = strings(); + if(_token.type != Token.TOK_SEMI) + { + throw new ParseError("Expected ';'"); + } + if(s.size() == 0) + { + throw new ParseError("usage: mkfile FILE [FILE...]"); + } + _parser.createFile(s); + } + else if(_token.type == Token.TOK_CREATE_DIR) + { + java.util.List<String> s = strings(); + if(_token.type != Token.TOK_SEMI) + { + throw new ParseError("Expected ';'"); + } + if(s.size() == 0) + { + throw new ParseError("usage: mkdir DIR [DIR...]"); + } + _parser.createDir(s); + } + else if(_token.type == Token.TOK_PWD) + { + _token = _scanner.nextToken(); + if(_token.type != Token.TOK_SEMI) + { + throw new ParseError("Expected ';'"); + } + _parser.pwd(); + } + else if(_token.type == Token.TOK_CD) + { + java.util.List<String> s = strings(); + if(_token.type != Token.TOK_SEMI) + { + throw new ParseError("Expected ';'"); + } + if(s.size() > 1) + { + throw new ParseError("usage: cd [DIR]"); + } + else if(s.size() == 0) + { + _parser.cd("/"); + } + else + { + _parser.cd(s.get(0)); + } + } + else if(_token.type == Token.TOK_CAT) + { + java.util.List<String> s = strings(); + if(_token.type != Token.TOK_SEMI) + { + throw new ParseError("Expected ';'"); + } + if(s.size() != 1) + { + throw new ParseError("usage: cat FILE"); + } + _parser.cat(s.get(0)); + } + else if(_token.type == Token.TOK_WRITE) + { + java.util.LinkedList<String> s = strings(); + if(_token.type != Token.TOK_SEMI) + { + throw new ParseError("Expected ';'"); + } + if(s.size() == 0) + { + throw new ParseError("usage: write FILE [STRING...]"); + } + _parser.write(s); + } + else if(_token.type == Token.TOK_RM) + { + java.util.List<String> s = strings(); + if(_token.type != Token.TOK_SEMI) + { + throw new ParseError("Expected ';'"); + } + if(s.size() == 0) + { + throw new ParseError("usage: rm NAME [NAME...]"); + } + _parser.destroy(s); + } + else + { + _parser.error("parse error"); + } + } + catch(ParseError e) + { + _parser.error("Parse error: " + e.getMessage()); + } + } + } + + private java.util.LinkedList<String> + strings() + { + java.util.LinkedList<String> l = new java.util.LinkedList<String>(); + while(true) + { + _token = _scanner.nextToken(); + if(_token.type != Token.TOK_STRING) + { + return l; + } + l.add(_token.value); + } + } + + static private class ParseError extends RuntimeException + { + ParseError(String msg) + { + super(msg); + } + } + + private Parser _parser; + private Scanner _scanner; + private Token _token; +} diff --git a/java/demo/Manual/evictor_filesystem/NodeFactory.java b/java/demo/Manual/evictor_filesystem/NodeFactory.java new file mode 100644 index 00000000000..80669a9bde2 --- /dev/null +++ b/java/demo/Manual/evictor_filesystem/NodeFactory.java @@ -0,0 +1,38 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +import Filesystem.*; + +public class NodeFactory implements Ice.ObjectFactory +{ + @Override + public Ice.Object + create(String type) + { + if(type.equals(PersistentFile.ice_staticId())) + { + return new FileI(); + } + else if(type.equals(PersistentDirectory.ice_staticId())) + { + return new DirectoryI(); + } + else + { + assert(false); + return null; + } + } + + @Override + public void + destroy() + { + } +} diff --git a/java/demo/Manual/evictor_filesystem/Parser.java b/java/demo/Manual/evictor_filesystem/Parser.java new file mode 100644 index 00000000000..8e89bed9a13 --- /dev/null +++ b/java/demo/Manual/evictor_filesystem/Parser.java @@ -0,0 +1,349 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +import Filesystem.*; + +class Parser +{ + Parser(DirectoryPrx root) + { + _dirs = new java.util.LinkedList<DirectoryPrx>(); + _dirs.addFirst(root); + } + + void + usage() + { + System.err.print( + "help Print this message.\n" + + "pwd Print current directory (/ = root).\n" + + "cd [DIR] Change directory (/ or empty = root).\n" + + "ls List current directory.\n" + + "lr Recursively list current directory.\n" + + "mkdir DIR [DIR...] Create directories DIR in current directory.\n" + + "mkfile FILE [FILE...] Create files FILE in current directory.\n" + + "rm NAME [NAME...] Delete directory or file NAME (rm * to delete all).\n" + + "cat FILE List the contents of FILE.\n" + + "write FILE [STRING...] Write STRING to FILE.\n" + + "exit, quit Exit this program.\n"); + } + + void + list(boolean recursive) + { + try + { + list(_dirs.get(0), recursive, 0); + } + catch(Ice.LocalException ex) + { + error(ex.toString()); + } + } + + void + list(Filesystem.DirectoryPrx dir, boolean recursive, int depth) + { + StringBuilder b = new StringBuilder(); + for(int i = 0; i < depth; ++i) + { + b.append('\t'); + } + String indent = b.toString(); + + NodeDesc[] contents = dir.list(); + + for(int i = 0; i < contents.length; ++i) + { + DirectoryPrx d + = contents[i].type == NodeType.DirType + ? DirectoryPrxHelper.uncheckedCast(contents[i].proxy) + : null; + System.out.print(indent + contents[i].name + (d != null ? " (directory)" : " (file)")); + if(d != null && recursive) + { + System.out.println(":"); + list(d, true, ++depth); + } + else + { + System.out.println(); + } + } + } + + void + createFile(java.util.List<String> names) + { + DirectoryPrx dir = _dirs.getFirst(); + + for(String name : names) + { + if(name.equals("..")) + { + System.out.println("Cannot create a file named `..'"); + continue; + } + + try + { + dir.createFile(name); + } + catch(NameInUse ex) + { + System.out.println("`" + name + "' exists already"); + } + } + } + + void + createDir(java.util.List<String> names) + { + DirectoryPrx dir = _dirs.getFirst(); + + for(String name : names) + { + if(name.equals("..")) + { + System.out.println("Cannot create a directory named `..'"); + continue; + } + + try + { + dir.createDirectory(name); + } + catch(NameInUse ex) + { + System.out.println("`" + name + "' exists already"); + } + } + } + + void + pwd() + { + if(_dirs.size() == 1) + { + System.out.print("/"); + } + else + { + java.util.ListIterator<DirectoryPrx> i = _dirs.listIterator(_dirs.size()); + i.previous(); + while(i.hasPrevious()) + { + System.out.print("/" + i.previous().name()); + } + } + System.out.println(); + } + + void + cd(String name) + { + if(name.equals("/")) + { + while(_dirs.size() > 1) + { + _dirs.removeFirst(); + } + return; + } + + if(name.equals("..")) + { + if(_dirs.size() > 1) + { + _dirs.removeFirst(); + } + return; + } + + DirectoryPrx dir = _dirs.getFirst(); + NodeDesc d; + try + { + d = dir.find(name); + } + catch(NoSuchName ex) + { + System.out.println("`" + name + "': no such directory"); + return; + } + if(d.type == NodeType.FileType) + { + System.out.println("`" + name + "': not a directory"); + return; + } + _dirs.addFirst(DirectoryPrxHelper.uncheckedCast(d.proxy)); + } + + void + cat(String name) + { + DirectoryPrx dir = _dirs.getFirst(); + NodeDesc d; + try + { + d = dir.find(name); + } + catch(NoSuchName ex) + { + System.out.println("`" + name + "': no such file"); + return; + } + if(d.type == NodeType.DirType) + { + System.out.println("`" + name + "': not a file"); + return; + } + FilePrx f = FilePrxHelper.uncheckedCast(d.proxy); + String[] l = f.read(); + for(int i = 0; i < l.length; ++i) + { + System.out.println(l[i]); + } + } + + void + write(java.util.LinkedList<String> args) + { + DirectoryPrx dir = _dirs.getFirst(); + String name = args.getFirst(); + args.removeFirst(); + NodeDesc d; + try + { + d = dir.find(name); + } + catch(NoSuchName ex) + { + System.out.println("`" + name + "': no such file"); + return; + } + if(d.type == NodeType.DirType) + { + System.out.println("`" + name + "': not a file"); + return; + } + FilePrx f = FilePrxHelper.uncheckedCast(d.proxy); + + String[] l = args.toArray(new String[0]); + try + { + f.write(l); + } + catch(GenericError ex) + { + System.out.println("`" + name + "': cannot write to file: " + ex.reason); + } + } + + void + destroy(java.util.List<String> names) + { + DirectoryPrx dir = _dirs.getFirst(); + + for(String name : names) + { + if(name.equals("*")) + { + NodeDesc[] nodes = dir.list(); + for(NodeDesc node : nodes) + { + try + { + node.proxy.destroy(); + } + catch(PermissionDenied ex) + { + System.out.println("cannot remove `" + node.name + "': " + ex.reason); + } + } + return; + } + else + { + NodeDesc d; + try + { + d = dir.find(name); + } + catch(NoSuchName ex) + { + System.out.println("`" + name + "': no such file or directory"); + return; + } + try + { + d.proxy.destroy(); + } + catch(PermissionDenied ex) + { + System.out.println("cannot remove `" + name + "': " + ex.reason); + } + } + } + } + + void + error(String s) + { + System.err.println("error: " + s); + } + + void + warning(String s) + { + System.err.println("warning: " + s); + } + + String + getInput() + { + System.out.print("> "); + System.out.flush(); + + try + { + return _in.readLine(); + } + catch(java.io.IOException e) + { + return null; + } + } + + int + parse() + { + _in = new java.io.BufferedReader(new java.io.InputStreamReader(System.in)); + + Grammar g = new Grammar(this); + g.parse(); + + return 0; + } + + int + parse(java.io.BufferedReader in) + { + _in = in; + + Grammar g = new Grammar(this); + g.parse(); + + return 0; + } + + private java.util.LinkedList<DirectoryPrx> _dirs; + + private java.io.BufferedReader _in; +} diff --git a/java/demo/Manual/evictor_filesystem/PersistentFilesystem.ice b/java/demo/Manual/evictor_filesystem/PersistentFilesystem.ice new file mode 100644 index 00000000000..07b7d43c382 --- /dev/null +++ b/java/demo/Manual/evictor_filesystem/PersistentFilesystem.ice @@ -0,0 +1,38 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +#pragma once + +#include <Filesystem.ice> + +module Filesystem +{ + class PersistentDirectory; + + class PersistentNode implements Node + { + string nodeName; + PersistentDirectory* parent; + }; + + class PersistentFile extends PersistentNode implements File + { + Lines text; + }; + + dictionary<string, NodeDesc> NodeDict; + + class PersistentDirectory extends PersistentNode implements Directory + { + ["freeze:write"] + void removeNode(string name); + + NodeDict nodes; + }; +}; diff --git a/java/demo/Manual/evictor_filesystem/README b/java/demo/Manual/evictor_filesystem/README new file mode 100644 index 00000000000..73ff1f9f14d --- /dev/null +++ b/java/demo/Manual/evictor_filesystem/README @@ -0,0 +1,11 @@ +This demo presents an alternate implementation of the filesystem +application using a Freeze evictor, as discussed in the Freeze chapter +of the Ice manual. + +To run it, start the server in a window: + +$ java -jar build/libs/server.jar + +Then run the client in a separate window: + +$ java -jar build/libs/client.jar diff --git a/java/demo/Manual/evictor_filesystem/Scanner.java b/java/demo/Manual/evictor_filesystem/Scanner.java new file mode 100644 index 00000000000..2b81fcfd450 --- /dev/null +++ b/java/demo/Manual/evictor_filesystem/Scanner.java @@ -0,0 +1,283 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +class Scanner +{ + Scanner(Parser p) + { + _parser = p; + } + + Token + nextToken() + { + String s = next(); + if(s == null) + { + return null; + } + + if(s.equals(";")) + { + return new Token(Token.TOK_SEMI); + } + else if(s.equals("help")) + { + return new Token(Token.TOK_HELP); + } + else if(s.equals("exit") || s.equals("quit")) + { + return new Token(Token.TOK_EXIT); + } + else if(s.equals("ls")) + { + return new Token(Token.TOK_LIST); + } + else if(s.equals("lr")) + { + return new Token(Token.TOK_LIST_RECURSIVE); + } + else if(s.equals("mkfile")) + { + return new Token(Token.TOK_CREATE_FILE); + } + else if(s.equals("mkdir")) + { + return new Token(Token.TOK_CREATE_DIR); + } + else if(s.equals("pwd")) + { + return new Token(Token.TOK_PWD); + } + else if(s.equals("cd")) + { + return new Token(Token.TOK_CD); + } + else if(s.equals("cat")) + { + return new Token(Token.TOK_CAT); + } + else if(s.equals("write")) + { + return new Token(Token.TOK_WRITE); + } + else if(s.equals("rm")) + { + return new Token(Token.TOK_RM); + } + else + { + return new Token(Token.TOK_STRING, s); + } + } + + static private class EndOfInput extends Exception + { + } + + private char + get() + throws EndOfInput + { + // + // If there is an character in the unget buffer, return it. + // + if(_unget) + { + _unget = false; + return _ungetChar; + } + + // + // No current buffer? + // + if(_buf == null) + { + _buf = _parser.getInput(); + _pos = 0; + if(_buf == null) + { + throw new EndOfInput(); + } + } + + // + // At the end-of-buffer? + // + while(_pos >= _buf.length()) + { + _buf = null; + _pos = 0; + return '\n'; + } + + return _buf.charAt(_pos++); + } + + // + // unget only works with one character. + // + private void + unget(char c) + { + assert(!_unget); + _unget = true; + _ungetChar = c; + } + + private String + next() + { + // + // Eat any whitespace. + // + char c; + try + { + do + { + c = get(); + } + while(Character.isWhitespace(c) && c != '\n'); + } + catch(EndOfInput ignore) + { + return null; + } + + StringBuilder buf = new StringBuilder(128); + + if(c == ';' || c == '\n') + { + buf.append(';'); + } + else if(c == '\'') + { + try + { + while(true) + { + c = get(); + if(c == '\'') + { + break; + } + else + { + buf.append(c); + } + } + } + catch(EndOfInput e) + { + _parser.warning("EOF in string"); + } + } + else if(c == '\"') + { + try + { + while(true) + { + c = get(); + if(c == '\"') + { + break; + } + else if(c == '\\') + { + try + { + char next = get(); + switch(next) + { + case '\\': + case '"': + { + buf.append(next); + break; + } + + case 'n': + { + buf.append('\n'); + break; + } + + case 'r': + { + buf.append('\r'); + break; + } + + case 't': + { + buf.append('\t'); + break; + } + + case 'f': + { + buf.append('\f'); + break; + } + + default: + { + buf.append(c); + unget(next); + } + } + } + catch(EndOfInput e) + { + buf.append(c); + } + } + else + { + buf.append(c); + } + } + } + catch(EndOfInput e) + { + _parser.warning("EOF in string"); + } + } + else + { + // + // Otherwise it's a string. + // + try + { + do + { + buf.append(c); + c = get(); + } + while(!Character.isWhitespace(c) && c != ';' && c != '\n'); + + unget(c); + } + catch(EndOfInput ignore) + { + } + } + + return buf.toString(); + } + + private Parser _parser; + private boolean _unget = false; + private char _ungetChar; + private String _buf = null; + private int _pos; +} diff --git a/java/demo/Manual/evictor_filesystem/Server.java b/java/demo/Manual/evictor_filesystem/Server.java new file mode 100644 index 00000000000..93449bf215c --- /dev/null +++ b/java/demo/Manual/evictor_filesystem/Server.java @@ -0,0 +1,82 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +import Filesystem.*; + +public class Server extends Ice.Application +{ + public + Server(String envName) + { + _envName = envName; + } + + @Override + public int + run(String[] args) + { + // + // Install object factories. + // + Ice.ObjectFactory factory = new NodeFactory(); + communicator().addObjectFactory(factory, PersistentFile.ice_staticId()); + communicator().addObjectFactory(factory, PersistentDirectory.ice_staticId()); + + // + // Create an object adapter. + // + Ice.ObjectAdapter adapter = communicator().createObjectAdapter("EvictorFilesystem"); + + // + // Create the Freeze evictor (stored in the _evictor + // static member). + // + Freeze.Evictor evictor = Freeze.Util.createTransactionalEvictor(adapter, _envName, "evictorfs", + null, null, null, true); + DirectoryI._evictor = evictor; + FileI._evictor = evictor; + + adapter.addServantLocator(evictor, ""); + + // + // Create the root node if it doesn't exist. + // + Ice.Identity rootId = new Ice.Identity(); + rootId.name = "RootDir"; + if(!evictor.hasObject(rootId)) + { + PersistentDirectory root = new DirectoryI(); + root.nodeName = "/"; + root.nodes = new java.util.HashMap<java.lang.String, NodeDesc>(); + evictor.add(root, rootId); + } + + // + // Ready to accept requests now. + // + adapter.activate(); + + // + // Wait until we are done. + // + communicator().waitForShutdown(); + + return 0; + } + + public static void + main(String[] args) + { + Server app = new Server("db"); + int status = app.main("demo.book.evictor_filesystem.Server", args, "config.server"); + System.exit(status); + } + + private String _envName; +} diff --git a/java/demo/Manual/evictor_filesystem/Token.java b/java/demo/Manual/evictor_filesystem/Token.java new file mode 100644 index 00000000000..7a538343d6c --- /dev/null +++ b/java/demo/Manual/evictor_filesystem/Token.java @@ -0,0 +1,40 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +class Token +{ + public static final int TOK_HELP = 0; + public static final int TOK_EXIT = 1; + public static final int TOK_SEMI = 2; + public static final int TOK_LIST = 3; + public static final int TOK_LIST_RECURSIVE = 4; + public static final int TOK_CREATE_FILE = 5; + public static final int TOK_CREATE_DIR = 6; + public static final int TOK_PWD = 7; + public static final int TOK_CD = 8; + public static final int TOK_CAT = 9; + public static final int TOK_WRITE = 10; + public static final int TOK_RM = 11; + public static final int TOK_STRING = 12; + + int type; + String value; + + Token(int t) + { + type = t; + value = null; + } + + Token(int t, String v) + { + type = t; + value = v; + } +} diff --git a/java/demo/Manual/evictor_filesystem/config.client b/java/demo/Manual/evictor_filesystem/config.client new file mode 100644 index 00000000000..640cfade4f1 --- /dev/null +++ b/java/demo/Manual/evictor_filesystem/config.client @@ -0,0 +1,28 @@ +# +# The client reads this property to create the reference to the root +# "directory" object in the server. +# +RootDir.Proxy=RootDir:default -h localhost -p 10000 + +# +# Warn about connection exceptions +# +Ice.Warn.Connections=1 + +# +# Network Tracing +# +# 0 = no network tracing +# 1 = trace connection establishment and closure +# 2 = like 1, but more detailed +# 3 = like 2, but also trace data transfer +# +#Ice.Trace.Network=1 + +# +# Protocol Tracing +# +# 0 = no protocol tracing +# 1 = trace protocol messages +# +#Ice.Trace.Protocol=1 diff --git a/java/demo/Manual/evictor_filesystem/config.server b/java/demo/Manual/evictor_filesystem/config.server new file mode 100644 index 00000000000..69e536ab202 --- /dev/null +++ b/java/demo/Manual/evictor_filesystem/config.server @@ -0,0 +1,49 @@ +# +# Configure the server endpoints. +# +EvictorFilesystem.Endpoints=default -h localhost -p 10000 + +# +# Freeze Map Tracing. +# +# 0 = No map activity trace (default). +# 1 = Trace database open and close. +# 2 = Also trace iterator and transaction operations, and reference +# counting of the underlying database. +# +Freeze.Trace.Map=1 + +# +# Freeze Evictor Tracing. +# +# 0 = No evictor activity trace (default). +# 1 = Trace Ice object and facet creation and destruction, facet +# streaming time, facet saving time, object eviction (every 50 +# objects) and evictor deactivation. +# 2 = Also trace object lookups, and all object evictions. +# 3 = Also trace object retrieval from the database. +# +Freeze.Trace.Evictor=2 + +# +# Warn about connection exceptions +# +Ice.Warn.Connections=1 + +# +# Network Tracing +# +# 0 = no network tracing +# 1 = trace connection establishment and closure +# 2 = like 1, but more detailed +# 3 = like 2, but also trace data transfer +# +#Ice.Trace.Network=1 + +# +# Protocol Tracing +# +# 0 = no protocol tracing +# 1 = trace protocol messages +# +#Ice.Trace.Protocol=1 diff --git a/java/demo/Manual/evictor_filesystem/demo_manual_evictor_filesystem.iml b/java/demo/Manual/evictor_filesystem/demo_manual_evictor_filesystem.iml new file mode 100644 index 00000000000..e32f5e3b556 --- /dev/null +++ b/java/demo/Manual/evictor_filesystem/demo_manual_evictor_filesystem.iml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/../../.." external.system.id="GRADLE" external.system.module.group="java" external.system.module.version="unspecified" type="JAVA_MODULE" version="4"> + <component name="NewModuleRootManager" inherit-compiler-output="false"> + <output url="file://$MODULE_DIR$/build/classes" /> + <output-test url="file://$MODULE_DIR$/build/classes/test" /> + <exclude-output /> + <content url="file://$MODULE_DIR$"> + <sourceFolder url="file://$MODULE_DIR$" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/build/generated-src" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" /> + <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" /> + <excludeFolder url="file://$MODULE_DIR$/.gradle" /> + <excludeFolder url="file://$MODULE_DIR$/build/dependency-cache" /> + <excludeFolder url="file://$MODULE_DIR$/build/tmp" /> + </content> + <orderEntry type="inheritedJdk" /> + <orderEntry type="sourceFolder" forTests="false" /> + <orderEntry type="module" module-name="Ice" exported="" /> + <orderEntry type="module" module-name="Freeze" exported="" /> + </component> +</module> + diff --git a/java/demo/Manual/evictor_filesystem/expect.py b/java/demo/Manual/evictor_filesystem/expect.py new file mode 100755 index 00000000000..bcd9eb26f47 --- /dev/null +++ b/java/demo/Manual/evictor_filesystem/expect.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python +# ********************************************************************** +# +# Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved. +# +# This copy of Ice is licensed to you under the terms described in the +# ICE_LICENSE file included in this distribution. +# +# ********************************************************************** + +import sys, os + +path = [ ".", "..", "../..", "../../..", "../../../.." ] +head = os.path.dirname(sys.argv[0]) +if len(head) > 0: + path = [os.path.join(head, p) for p in path] +path = [os.path.abspath(p) for p in path if os.path.exists(os.path.join(p, "demoscript")) ] +if len(path) == 0: + raise RuntimeError("can't find toplevel directory!") +sys.path.append(path[0]) + +from demoscript import Util +from demoscript.manual import evictor_filesystem + +sys.stdout.write("cleaning databases... ") +sys.stdout.flush() +Util.cleanDbDir("db") +print("ok") + +server = Util.spawn('java -jar build/libs/server.jar --Ice.PrintAdapterReady') +server.expect('.* ready') +client = Util.spawn('java -jar build/libs/client.jar') + +evictor_filesystem.run(client, server) |