Britt Park be6a222554 Extended the content model to include relevant avm specific types.
cm:avmcontent and cm:avmfolder are 'abstract'.  cm:avmplaincontent is derived
from cm:avmcontent and is just a plain file. cm:avmlayeredcontent is derived
from cm:avmcontent and is (surprise) a layered file and has a d:noderef mandatory
property, cm:avmfileindirection, that is the (possibly non-existent) file that
the layered file is transparent to.  cm:avmplainfolder is derived from 
cm:avmfolder and is just a plain directory.  cm:avmlayeredfolder is a layered
directory and has a property, cm:avmdirinderection, that is the (possibly
non-existent) directory that the layered directory is transparent to.
The ContentModel QName constants are.
TYPE_AVM_PLAIN_FOLDER
TYPE_AVM_LAYERED_FOLDER
TYPE_AVM_PLAIN_CONTENT
TYPE_AVM_LAYERED_CONTENT
PROP_AVM_DIR_INDIRECTION
PROP_AVM_FILE_INDIRECTION
One can now create all four flavors of avm nodes through 
AVMNodeService.createNode().  The advantage of using these over the
corresponding AVMService methods is that since (for now) AVMService, is
permission and indexing unaware.
Backed out cm:mounted aspect and dispatching code in DbNodeServiceImpl.  
(Dave and Derek, you may now relax) as we are implementing the UI with
AVM dedicated screens.
Finally, beginning interface for AVM node tree synchronization and comparison.


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@3764 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
2006-09-12 03:16:10 +00:00

478 lines
15 KiB
Java

/*
* Copyright (C) 2006 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.repo.avm;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.avm.util.BulkLoader;
import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
import org.alfresco.service.cmr.avm.AVMService;
import org.alfresco.service.cmr.avm.AVMStoreDescriptor;
import org.alfresco.service.cmr.avm.VersionDescriptor;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.apache.log4j.Logger;
import org.springframework.context.support.FileSystemXmlApplicationContext;
/**
* An interactive console for the AVM repository.
* @author britt
*/
public class AVMInterpreter
{
private static Logger fgLogger = Logger.getLogger(AVMInterpreter.class);
/**
* The service interface.
*/
private AVMService fService;
/**
* The Node service.
*/
private NodeService fNodeService;
/**
* The reader for interaction.
*/
private BufferedReader fIn;
/**
* The Bulk Loader.
*/
private BulkLoader fLoader;
/**
* Main entry point.
* Syntax: AVMInteractiveConsole storage (new|old).
*/
public static void main(String[] args)
{
FileSystemXmlApplicationContext context =
new FileSystemXmlApplicationContext("config/alfresco/avm-console-context.xml");
AVMInterpreter console = (AVMInterpreter)context.getBean("interactiveConsole");
console.rep();
context.close();
}
/**
* Make up a new console.
*/
public AVMInterpreter()
{
fIn = new BufferedReader(new InputStreamReader(System.in));
}
/**
* Set the AVMService.
* @param service The AVMService instance.
*/
public void setAvmService(AVMService service)
{
fService = service;
}
/**
* Set the bulk loader.
* @param loader
*/
public void setBulkLoader(BulkLoader loader)
{
fLoader = loader;
}
public void setNodeService(NodeService service)
{
fNodeService = service;
}
/**
* A Read-Eval-Print loop.
*/
public void rep()
{
while (true)
{
System.out.print("> ");
try
{
String line = fIn.readLine();
if (line.equals("exit"))
{
return;
}
System.out.println(interpretCommand(line, fIn));
}
catch (IOException ie)
{
ie.printStackTrace(System.err);
System.exit(2);
}
}
}
/**
* Interpret a single command using the BufferedReader passed in for any data needed.
* @param line The unparsed command
* @param in A Reader to be used for commands that need input data.
* @return The textual output of the command.
*/
public String interpretCommand(String line, BufferedReader in)
{
String[] command = line.split(",\\s+");
if (command.length == 0)
{
command = new String[1];
command[0] = line;
}
try
{
ByteArrayOutputStream bout = new ByteArrayOutputStream();
PrintStream out = new PrintStream(bout);
if (command[0].equals("ls"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
AVMNodeDescriptor desc = fService.lookup(Integer.parseInt(command[2]),
command[1]);
Map<String, AVMNodeDescriptor> listing =
fService.getDirectoryListing(desc);
for (String name : listing.keySet())
{
out.println(name + " " + listing.get(name));
}
}
else if (command[0].equals("lsr"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
AVMNodeDescriptor desc = fService.lookup(Integer.parseInt(command[2]),
command[1]);
recursiveList(out, desc, 0);
}
else if (command[0].equals("lsrep"))
{
List<AVMStoreDescriptor> repos = fService.getAVMStores();
for (AVMStoreDescriptor repo : repos)
{
out.println(repo);
}
}
else if (command[0].equals("lsver"))
{
if (command.length != 2)
{
return "Syntax Error.";
}
List<VersionDescriptor> listing = fService.getAVMStoreVersions(command[1]);
for (VersionDescriptor desc : listing)
{
out.println(desc);
}
}
else if (command[0].equals("mkrep"))
{
if (command.length != 2)
{
return "Syntax Error.";
}
fService.createAVMStore(command[1]);
}
else if (command[0].equals("load"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
fLoader.recursiveLoad(command[1], command[2]);
}
else if (command[0].equals("mkdir"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
fService.createDirectory(command[1], command[2]);
}
else if (command[0].equals("mkbr"))
{
if (command.length != 5)
{
return "Syntax Error.";
}
fService.createBranch(Integer.parseInt(command[4]), command[1], command[2], command[3]);
}
else if (command[0].equals("mkldir"))
{
if (command.length != 4)
{
return "Syntax Error.";
}
fService.createLayeredDirectory(command[1], command[2], command[3]);
}
else if (command[0].equals("rename"))
{
if (command.length != 5)
{
return "Syntax Error.";
}
fService.rename(command[1], command[2], command[3], command[4]);
}
else if (command[0].equals("cp"))
{
if (command.length != 5)
{
return "Syntax Error.";
}
InputStream fin = fService.getFileInputStream(Integer.parseInt(command[2]), command[1]);
OutputStream fout = fService.createFile(command[3], command[4]);
byte [] buff = new byte[8192];
int read;
while ((read = fin.read(buff)) != -1)
{
fout.write(buff, 0, read);
}
fin.close();
fout.close();
}
else if (command[0].equals("retarget"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
fService.retargetLayeredDirectory(command[1], command[2]);
}
else if (command[0].equals("mkprimary"))
{
if (command.length != 2)
{
return "Syntax Error.";
}
fService.makePrimary(command[1]);
}
else if (command[0].equals("mklfile"))
{
if (command.length != 4)
{
return "Syntax Error.";
}
fService.createLayeredFile(command[1], command[2], command[3]);
}
else if (command[0].equals("snap"))
{
if (command.length != 2)
{
return "Syntax Error.";
}
fService.createSnapshot(command[1]);
}
else if (command[0].equals("cat"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
BufferedReader reader =
new BufferedReader(
new InputStreamReader(fService.getFileInputStream(Integer.parseInt(command[2]),
command[1])));
String l;
while ((l = reader.readLine()) != null)
{
out.println(l);
}
reader.close();
}
else if (command[0].equals("rm"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
fService.removeNode(command[1], command[2]);
}
else if (command[0].equals("rmrep"))
{
if (command.length != 2)
{
return "Syntax Error.";
}
fService.purgeAVMStore(command[1]);
}
else if (command[0].equals("rmver"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
fService.purgeVersion(Integer.parseInt(command[2]), command[1]);
}
else if (command[0].equals("write"))
{
if (command.length != 2)
{
return "Syntax Error.";
}
PrintStream ps =
new PrintStream(fService.getFileOutputStream(command[1]));
String l;
while (!(l = in.readLine()).equals(""))
{
ps.println(l);
}
ps.close();
}
else if (command[0].equals("create"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
PrintStream ps =
new PrintStream(fService.createFile(command[1], command[2]));
String l;
while (!(l = in.readLine()).equals(""))
{
ps.println(l);
}
ps.close();
}
else if (command[0].equals("stat"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
AVMNodeDescriptor desc = fService.lookup(Integer.parseInt(command[2]), command[1]);
out.println(desc);
out.println("Version: " + desc.getVersionID());
out.println("Owner: " + desc.getOwner());
out.println("Mod Time: " + new Date(desc.getModDate()));
}
else if (command[0].equals("history"))
{
if (command.length != 4)
{
return "Syntax Error.";
}
AVMNodeDescriptor desc = fService.lookup(Integer.parseInt(command[2]), command[1]);
List<AVMNodeDescriptor> history = fService.getHistory(desc, Integer.parseInt(command[3]));
for (AVMNodeDescriptor node : history)
{
out.println(node);
out.println("Version: " + desc.getVersionID());
out.println("Owner: " + desc.getOwner());
out.println("Mod Time: " + new Date(desc.getModDate()));
}
}
/*
else if (command[0].equals("catver"))
{
if (command.length != 4)
{
return "Syntax Error.";
}
AVMNodeDescriptor desc = fService.lookup(Integer.parseInt(command[2]), command[1]);
List<AVMNodeDescriptor> history = fService.getHistory(desc, Integer.parseInt(command[3]));
if (history.size() == 0)
{
return "No History.";
}
BufferedReader reader =
new BufferedReader(
new InputStreamReader(
fService.getFileInputStream(history.get(history.size() - 1))));
String l;
while ((l = reader.readLine()) != null)
{
out.println(l);
}
reader.close();
}
*/
else if (command[0].equals("ca"))
{
if (command.length != 5)
{
return "Syntax Error.";
}
AVMNodeDescriptor left = fService.lookup(Integer.parseInt(command[2]), command[1]);
AVMNodeDescriptor right = fService.lookup(Integer.parseInt(command[4]), command[3]);
AVMNodeDescriptor ca = fService.getCommonAncestor(left, right);
out.println(ca);
}
else
{
return "Syntax Error.";
}
out.flush();
String retVal = new String(bout.toByteArray());
out.close();
return retVal;
}
catch (Exception e)
{
e.printStackTrace(System.err);
return e.toString();
}
}
private void recursiveList(PrintStream out, AVMNodeDescriptor dir, int indent)
{
Map<String, AVMNodeDescriptor> listing = fService.getDirectoryListing(dir);
for (String name : listing.keySet())
{
AVMNodeDescriptor child = listing.get(name);
for (int i = 0; i < indent; i++)
{
out.print(' ');
}
out.println(name + " " + child);
if (child.isDirectory())
{
recursiveList(out, child, indent + 2);
}
}
}
}