mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-06-02 17:35:18 +00:00
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
478 lines
15 KiB
Java
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|