diff --git a/source/java/hibernate.cfg.xml b/source/java/hibernate.cfg.xml index 564ec176cd..8cb0ff9e28 100644 --- a/source/java/hibernate.cfg.xml +++ b/source/java/hibernate.cfg.xml @@ -15,9 +15,6 @@ 20 900 50 - - - - + diff --git a/source/java/org/alfresco/repo/avm/AVMNode.java b/source/java/org/alfresco/repo/avm/AVMNode.java index 6f6dc9d9a3..6ec28a1121 100644 --- a/source/java/org/alfresco/repo/avm/AVMNode.java +++ b/source/java/org/alfresco/repo/avm/AVMNode.java @@ -153,15 +153,18 @@ public abstract class AVMNode */ public AVMNode copyOnWrite(Lookup lPath) { + // Call the subclass's copy on write logic. AVMNode newMe = possiblyCopy(lPath); - String myName = lPath.getName(); - lPath.upCurrentNode(); + // No copying needed, so short circuit. if (newMe == null) { return this; } - Repository repos = getRepository(); + String myName = lPath.getName(); + lPath.upCurrentNode(); + Repository repos = lPath.getRepository(); newMe.setVersion(repos.getLatestVersion() + 1); + // Get our parent directory if we have one. DirectoryNode parent = null; if (getParent() != null) { @@ -169,6 +172,7 @@ public abstract class AVMNode } if (parent != null) { + // Recursive invocation. DirectoryNode newParent = (DirectoryNode)parent.copyOnWrite(lPath); newParent.putChild(myName, newMe); @@ -176,15 +180,14 @@ public abstract class AVMNode } else // Null parent means root of repository. { - newMe.setRepository(getRepository()); repos.setNewRoot((DirectoryNode)newMe); } + newMe.setRepository(repos); newMe.setShouldBeCopied(false); repos.setNew(newMe); return newMe; } - /** * Possibly copy ourselves. * @param lPath The Lookup for this node. diff --git a/source/java/org/alfresco/repo/avm/AVMNodeFactory.java b/source/java/org/alfresco/repo/avm/AVMNodeFactory.java index 2c1179b3c5..7efb311b63 100644 --- a/source/java/org/alfresco/repo/avm/AVMNodeFactory.java +++ b/source/java/org/alfresco/repo/avm/AVMNodeFactory.java @@ -24,7 +24,8 @@ import org.alfresco.repo.avm.hibernate.PlainDirectoryNodeBean; import org.alfresco.repo.avm.hibernate.PlainFileNodeBean; /** - * Responsible for instantiating AVMNode implementations. + * Responsible for instantiating AVMNode concrete subclasses from + * underlying data beans. * @author britt */ public class AVMNodeFactory diff --git a/source/java/org/alfresco/repo/avm/AVMService.java b/source/java/org/alfresco/repo/avm/AVMService.java index 37d0a32997..01a750a08d 100644 --- a/source/java/org/alfresco/repo/avm/AVMService.java +++ b/source/java/org/alfresco/repo/avm/AVMService.java @@ -25,8 +25,8 @@ import java.util.Set; /** * This is the service interface for the [Alfresco|Addled|Advanced|Apotheosed] Versioning * Model. It specifies methods that are close in functionality to the underlying - * implementation, and is intended, for now, as an internal interface to build a different - * implementation of NodeService and others. + * implementation, and is intended as both a first class Alfresco service and an + * aid in creating new implementations of existing services. * @author britt */ public interface AVMService diff --git a/source/java/org/alfresco/repo/avm/DirectoryNode.java b/source/java/org/alfresco/repo/avm/DirectoryNode.java index dc753b7ae5..9d31e632ee 100644 --- a/source/java/org/alfresco/repo/avm/DirectoryNode.java +++ b/source/java/org/alfresco/repo/avm/DirectoryNode.java @@ -22,7 +22,7 @@ import java.util.Map; import org.alfresco.repo.avm.hibernate.DirectoryEntry; /** - * + * Base class for Directories. * @author britt */ public abstract class DirectoryNode extends AVMNode diff --git a/source/java/org/alfresco/repo/avm/FileContent.java b/source/java/org/alfresco/repo/avm/FileContent.java index 7f7e5a5c9b..9821c051b0 100644 --- a/source/java/org/alfresco/repo/avm/FileContent.java +++ b/source/java/org/alfresco/repo/avm/FileContent.java @@ -17,11 +17,15 @@ package org.alfresco.repo.avm; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.Formatter; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.repo.avm.hibernate.ContentBean; @@ -38,6 +42,16 @@ public class FileContent */ private ContentBean fData; + /** + * The name of the file. + */ + private String fName; + + /** + * The directory path of the file. + */ + private String fPath; + /** * Make one from a bean. * @param data The Bean with the data. @@ -45,6 +59,7 @@ public class FileContent public FileContent(ContentBean data) { fData = data; + } /** @@ -54,6 +69,17 @@ public class FileContent public FileContent(SuperRepository superRepo) { fData = new ContentBeanImpl(superRepo.issueContentID()); + BufferedOutputStream out = new BufferedOutputStream(getOutputStream(superRepo)); + // Make an empty file. + try + { + out.close(); + } + catch (IOException ie) + { + throw new AlfrescoRuntimeException("Couldn't close file.", ie); + } + superRepo.getSession().save(fData); } /** @@ -64,7 +90,25 @@ public class FileContent public FileContent(FileContent other, SuperRepository superRepo) { fData = new ContentBeanImpl(superRepo.issueContentID()); - // TODO Something. + // Copy the contents from other to this. + BufferedInputStream in = new BufferedInputStream(other.getInputStream(superRepo)); + BufferedOutputStream out = new BufferedOutputStream(this.getOutputStream(superRepo)); + try + { + byte [] buff = new byte[4096]; // Nyah, nyah. + int bytesRead; + while ((bytesRead = in.read(buff)) != -1) + { + out.write(buff, 0, bytesRead); + } + out.close(); + in.close(); + } + catch (IOException ie) + { + throw new AlfrescoRuntimeException("I/O failure in Copy on Write.", ie); + } + superRepo.getSession().save(fData); } /** @@ -92,8 +136,14 @@ public class FileContent */ public InputStream getInputStream(SuperRepository superRepo) { - // TODO Something. - return null; + try + { + return new FileInputStream(getContentPath(superRepo)); + } + catch (IOException ie) + { + throw new AlfrescoRuntimeException("Could not open for reading: " + getContentPath(superRepo), ie); + } } /** @@ -103,8 +153,19 @@ public class FileContent */ public OutputStream getOutputStream(SuperRepository superRepo) { - // TODO Something. - return null; + try + { + File dir = new File(getDirectoryPath(superRepo)); + if (!dir.exists()) + { + dir.mkdirs(); + } + return new FileOutputStream(getContentPath(superRepo)); + } + catch (IOException ie) + { + throw new AlfrescoRuntimeException("Could not open for writing: " + getContentPath(superRepo), ie); + } } /** @@ -115,4 +176,51 @@ public class FileContent { return fData; } + + /** + * Retrieve the full path for this content. + * @param superRepo + * @return The full path for this content. + */ + private String getContentPath(SuperRepository superRepo) + { + if (fName == null) + { + calcPathData(superRepo); + } + return fName; + } + + /** + * Get the directory path for this content. + * @param superRepo + * @return The directory path. + */ + private String getDirectoryPath(SuperRepository superRepo) + { + if (fPath == null) + { + calcPathData(superRepo); + } + return fPath; + } + + /** + * Calculate the path data. + */ + private void calcPathData(SuperRepository superRepo) + { + long id = fData.getId(); + Formatter form = new Formatter(new StringBuilder()); + form.format("%016x", id); + String name = form.toString(); + form = new Formatter(new StringBuilder()); + form.format("/%02x/%02x/%02x", + (id & 0xff000000) >> 24, + (id & 0xff0000) >> 16, + (id & 0xff00) >> 8); + String dir = form.toString(); + fPath = superRepo.getStorageRoot() + dir; + fName = fPath + "/" + name; + } } diff --git a/source/java/org/alfresco/repo/avm/FileContentFactory.java b/source/java/org/alfresco/repo/avm/FileContentFactory.java deleted file mode 100644 index a2a52b5133..0000000000 --- a/source/java/org/alfresco/repo/avm/FileContentFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * 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 org.alfresco.repo.avm.hibernate.ContentBean; - -/** - * Static method for making FileContent instances from beans. - * @author britt - */ -public class FileContentFactory -{ - /** - * Make A FileContent object from a ContentBean. - * @param bean The bean with the data. - */ - public static FileContent CreateFileContentFromBean(ContentBean bean) - { - return new FileContent(bean); - } -} diff --git a/source/java/org/alfresco/repo/avm/FileNode.java b/source/java/org/alfresco/repo/avm/FileNode.java index 8bb82f8d35..b95ef73980 100644 --- a/source/java/org/alfresco/repo/avm/FileNode.java +++ b/source/java/org/alfresco/repo/avm/FileNode.java @@ -18,7 +18,7 @@ package org.alfresco.repo.avm; /** - * Interface for file objects. + * Base class for file objects. * @author britt */ public abstract class FileNode extends AVMNode diff --git a/source/java/org/alfresco/repo/avm/LayeredDirectoryNode.java b/source/java/org/alfresco/repo/avm/LayeredDirectoryNode.java index 1934913eb6..bfcf09b3a5 100644 --- a/source/java/org/alfresco/repo/avm/LayeredDirectoryNode.java +++ b/source/java/org/alfresco/repo/avm/LayeredDirectoryNode.java @@ -18,7 +18,6 @@ package org.alfresco.repo.avm; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; import java.util.TreeMap; @@ -30,7 +29,11 @@ import org.alfresco.repo.avm.hibernate.LayeredDirectoryNodeBean; import org.alfresco.repo.avm.hibernate.LayeredDirectoryNodeBeanImpl; /** - * Interface for a layered directory node. Stub. + * A layered directory node. A layered directory node points at + * an underlying directory, which may or may not exist. The visible + * contents of a layered directory node is the contents of the underlying node + * pointed at plus those nodes added to or modified in the layered directory node minus + * those nodes which have been deleted in the layered directory node. * @author britt */ public class LayeredDirectoryNode extends DirectoryNode implements Layered @@ -57,7 +60,9 @@ public class LayeredDirectoryNode extends DirectoryNode implements Layered */ public LayeredDirectoryNode(String indirection, Repository repos) { + // Set up basic attributes for this node. long time = System.currentTimeMillis(); + // TODO We'll fix this up when Britt understands user management. BasicAttributesBean attrs = new BasicAttributesBeanImpl("britt", "britt", "britt", diff --git a/source/java/org/alfresco/repo/avm/Lookup.java b/source/java/org/alfresco/repo/avm/Lookup.java index 006d082823..165833a655 100644 --- a/source/java/org/alfresco/repo/avm/Lookup.java +++ b/source/java/org/alfresco/repo/avm/Lookup.java @@ -30,7 +30,6 @@ public class Lookup /** * The Repository. */ - @SuppressWarnings("unused") private Repository fRepository; /** @@ -287,4 +286,13 @@ public class Lookup { return fTopLayer; } + + /** + * Get the repository that this path is in. + * @return The repository. + */ + public Repository getRepository() + { + return fRepository; + } } diff --git a/source/java/org/alfresco/repo/avm/PlainFileNode.java b/source/java/org/alfresco/repo/avm/PlainFileNode.java index 9158baf3f2..36f3db27dd 100644 --- a/source/java/org/alfresco/repo/avm/PlainFileNode.java +++ b/source/java/org/alfresco/repo/avm/PlainFileNode.java @@ -145,7 +145,7 @@ public class PlainFileNode extends FileNode */ public FileContent getContentForRead(int version) { - return FileContentFactory.CreateFileContentFromBean(fData.getContent()); + return new FileContent(fData.getContent()); } /** @@ -159,6 +159,6 @@ public class PlainFileNode extends FileNode fData.setContent(new ContentBeanImpl(repo.getSuperRepository().issueContentID())); // Need to copy the underlying file data. } - return FileContentFactory.CreateFileContentFromBean(fData.getContent()); + return new FileContent(fData.getContent()); } } diff --git a/source/java/org/alfresco/repo/avm/SuperRepository.java b/source/java/org/alfresco/repo/avm/SuperRepository.java index 82c225dfa0..2f48b8bac0 100644 --- a/source/java/org/alfresco/repo/avm/SuperRepository.java +++ b/source/java/org/alfresco/repo/avm/SuperRepository.java @@ -237,4 +237,10 @@ public interface SuperRepository * @return The Lookup. */ public Lookup lookupDirectory(int version, String path); + + /** + * Get the root directory in which file data is stored. + * @return The root directory of storage. + */ + public String getStorageRoot(); } diff --git a/source/java/org/alfresco/repo/avm/hibernate/AVM.hbm.xml b/source/java/org/alfresco/repo/avm/hibernate/AVM.hbm.xml new file mode 100644 index 0000000000..4bbc973aec --- /dev/null +++ b/source/java/org/alfresco/repo/avm/hibernate/AVM.hbm.xml @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/source/java/org/alfresco/repo/avm/hibernate/AVMNode.hbm.xml b/source/java/org/alfresco/repo/avm/hibernate/AVMNode.hbm.xml deleted file mode 100644 index 187bbfa48b..0000000000 --- a/source/java/org/alfresco/repo/avm/hibernate/AVMNode.hbm.xml +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/java/org/alfresco/repo/avm/hibernate/Content.hbm.xml b/source/java/org/alfresco/repo/avm/hibernate/Content.hbm.xml deleted file mode 100644 index 9e0b69f80b..0000000000 --- a/source/java/org/alfresco/repo/avm/hibernate/Content.hbm.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - diff --git a/source/java/org/alfresco/repo/avm/hibernate/Issuer.hbm.xml b/source/java/org/alfresco/repo/avm/hibernate/Issuer.hbm.xml deleted file mode 100644 index 4d7728a978..0000000000 --- a/source/java/org/alfresco/repo/avm/hibernate/Issuer.hbm.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - diff --git a/source/java/org/alfresco/repo/avm/hibernate/Repository.hbm.xml b/source/java/org/alfresco/repo/avm/hibernate/Repository.hbm.xml deleted file mode 100644 index f7477d2fda..0000000000 --- a/source/java/org/alfresco/repo/avm/hibernate/Repository.hbm.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/java/org/alfresco/repo/avm/hibernate/TestPopulate.java b/source/java/org/alfresco/repo/avm/hibernate/TestPopulate.java index 1f2d2189e8..f17eb08d80 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/TestPopulate.java +++ b/source/java/org/alfresco/repo/avm/hibernate/TestPopulate.java @@ -201,6 +201,7 @@ public class TestPopulate extends TestCase { assertEquals(AVMNodeType.PLAIN_FILE, entry.getEntryType()); } + assertEquals("britt", root.getBasicAttributes().getCreator()); } }); assertTrue(result); diff --git a/source/java/org/alfresco/repo/avm/impl/AVMServiceImpl.java b/source/java/org/alfresco/repo/avm/impl/AVMServiceImpl.java index 3af00463b8..44fd2a5c3a 100644 --- a/source/java/org/alfresco/repo/avm/impl/AVMServiceImpl.java +++ b/source/java/org/alfresco/repo/avm/impl/AVMServiceImpl.java @@ -54,6 +54,11 @@ public class AVMServiceImpl implements AVMService */ private ThreadLocal fSuperRepository; + /** + * The storage directory. + */ + private String fStorage; + /** * Basic constructor for the service. */ @@ -63,6 +68,15 @@ public class AVMServiceImpl implements AVMService fTransaction = new HibernateTxn(fSessionFactory); } + /** + * Set the location of file storage. + * @param storage + */ + public void setStorage(String storage) + { + fStorage = storage; + } + /* (non-Javadoc) * @see org.alfresco.repo.avm.AVMService#getFileInputStream(int, java.lang.String) */ @@ -74,7 +88,7 @@ public class AVMServiceImpl implements AVMService public void perform(Session session) { - fSuperRepository.set(new SuperRepositoryImpl(session)); + fSuperRepository.set(new SuperRepositoryImpl(session, fStorage)); in = fSuperRepository.get().getInputStream(version, path); } }; @@ -94,7 +108,7 @@ public class AVMServiceImpl implements AVMService public void perform(Session session) { - fSuperRepository.set(new SuperRepositoryImpl(session)); + fSuperRepository.set(new SuperRepositoryImpl(session, fStorage)); out = fSuperRepository.get().getOutputStream(path); } }; @@ -114,7 +128,7 @@ public class AVMServiceImpl implements AVMService public void perform(Session session) { - fSuperRepository.set(new SuperRepositoryImpl(session)); + fSuperRepository.set(new SuperRepositoryImpl(session, fStorage)); listing = fSuperRepository.get().getListing(version, path); } } @@ -132,7 +146,7 @@ public class AVMServiceImpl implements AVMService { public void perform(Session session) { - fSuperRepository.set(new SuperRepositoryImpl(session)); + fSuperRepository.set(new SuperRepositoryImpl(session, fStorage)); fSuperRepository.get().createFile(path, name); } } @@ -149,7 +163,7 @@ public class AVMServiceImpl implements AVMService { public void perform(Session session) { - fSuperRepository.set(new SuperRepositoryImpl(session)); + fSuperRepository.set(new SuperRepositoryImpl(session, fStorage)); fSuperRepository.get().createDirectory(path, name); } } @@ -166,7 +180,7 @@ public class AVMServiceImpl implements AVMService { public void perform(Session session) { - fSuperRepository.set(new SuperRepositoryImpl(session)); + fSuperRepository.set(new SuperRepositoryImpl(session, fStorage)); fSuperRepository.get().createLayeredFile(srcPath, parent, name); } } @@ -183,7 +197,7 @@ public class AVMServiceImpl implements AVMService { public void perform(Session session) { - fSuperRepository.set(new SuperRepositoryImpl(session)); + fSuperRepository.set(new SuperRepositoryImpl(session, fStorage)); fSuperRepository.get().createLayeredDirectory(srcPath, parent, name); } } @@ -200,7 +214,7 @@ public class AVMServiceImpl implements AVMService { public void perform(Session session) { - fSuperRepository.set(new SuperRepositoryImpl(session)); + fSuperRepository.set(new SuperRepositoryImpl(session, fStorage)); fSuperRepository.get().createRepository(name); } } @@ -218,7 +232,7 @@ public class AVMServiceImpl implements AVMService { public void perform(Session session) { - fSuperRepository.set(new SuperRepositoryImpl(session)); + fSuperRepository.set(new SuperRepositoryImpl(session, fStorage)); fSuperRepository.get().createBranch(version, srcPath, dstPath, name); } } @@ -235,7 +249,7 @@ public class AVMServiceImpl implements AVMService { public void perform(Session session) { - fSuperRepository.set(new SuperRepositoryImpl(session)); + fSuperRepository.set(new SuperRepositoryImpl(session, fStorage)); fSuperRepository.get().remove(parent, name); } } @@ -253,7 +267,7 @@ public class AVMServiceImpl implements AVMService { public void perform(Session session) { - fSuperRepository.set(new SuperRepositoryImpl(session)); + fSuperRepository.set(new SuperRepositoryImpl(session, fStorage)); fSuperRepository.get().rename(srcParent, srcName, dstParent, dstName); } } @@ -271,7 +285,7 @@ public class AVMServiceImpl implements AVMService { public void perform(Session session) { - fSuperRepository.set(new SuperRepositoryImpl(session)); + fSuperRepository.set(new SuperRepositoryImpl(session, fStorage)); fSuperRepository.get().slide(srcParent, srcName, dstParent, dstName); } } @@ -290,7 +304,7 @@ public class AVMServiceImpl implements AVMService public void perform(Session session) { - fSuperRepository.set(new SuperRepositoryImpl(session)); + fSuperRepository.set(new SuperRepositoryImpl(session, fStorage)); latestVersionID = fSuperRepository.get().getLatestVersionID(repName); } } @@ -308,7 +322,7 @@ public class AVMServiceImpl implements AVMService { public void perform(Session session) { - fSuperRepository.set(new SuperRepositoryImpl(session)); + fSuperRepository.set(new SuperRepositoryImpl(session, fStorage)); fSuperRepository.get().createSnapshot(repositories); } } @@ -327,7 +341,7 @@ public class AVMServiceImpl implements AVMService public void perform(Session session) { - fSuperRepository.set(new SuperRepositoryImpl(session)); + fSuperRepository.set(new SuperRepositoryImpl(session, fStorage)); lookup = fSuperRepository.get().lookup(version, path); } } @@ -345,7 +359,7 @@ public class AVMServiceImpl implements AVMService { public void perform(Session session) { - fSuperRepository.set(new SuperRepositoryImpl(session)); + fSuperRepository.set(new SuperRepositoryImpl(session, fStorage)); fSuperRepository.get().destroyRepository(name); } } @@ -362,7 +376,7 @@ public class AVMServiceImpl implements AVMService { public void perform(Session session) { - fSuperRepository.set(new SuperRepositoryImpl(session)); + fSuperRepository.set(new SuperRepositoryImpl(session, fStorage)); fSuperRepository.get().purgeVersion(name, version); } } @@ -381,7 +395,7 @@ public class AVMServiceImpl implements AVMService public void perform(Session session) { - fSuperRepository.set(new SuperRepositoryImpl(session)); + fSuperRepository.set(new SuperRepositoryImpl(session, fStorage)); indirectionPath = fSuperRepository.get().getIndirectionPath(version, path); } } @@ -401,7 +415,7 @@ public class AVMServiceImpl implements AVMService public void perform(Session session) { - fSuperRepository.set(new SuperRepositoryImpl(session)); + fSuperRepository.set(new SuperRepositoryImpl(session, fStorage)); versions = fSuperRepository.get().getRepositoryVersions(name); } } diff --git a/source/java/org/alfresco/repo/avm/impl/SuperRepositoryImpl.java b/source/java/org/alfresco/repo/avm/impl/SuperRepositoryImpl.java index 0bbc68c490..254228575d 100644 --- a/source/java/org/alfresco/repo/avm/impl/SuperRepositoryImpl.java +++ b/source/java/org/alfresco/repo/avm/impl/SuperRepositoryImpl.java @@ -70,14 +70,21 @@ public class SuperRepositoryImpl implements SuperRepository * The layer id issuer. */ private Issuer fLayerIssuer; + + /** + * The file storage directory. + */ + private String fStorage; /** * Make a new one, initialized with the session. * @param session The session for this operation. + * @param storage Where file data gets stored. */ - public SuperRepositoryImpl(Session session) + public SuperRepositoryImpl(Session session, String storage) { fSession = session; + fStorage = storage; fNodeIssuer = (Issuer)fSession.get(Issuer.class, "node"); fContentIssuer = (Issuer)fSession.get(Issuer.class, "content"); fBranchIssuer = (Issuer)fSession.get(Issuer.class, "branch"); @@ -506,4 +513,12 @@ public class SuperRepositoryImpl implements SuperRepository } return pathParts; } + + /* (non-Javadoc) + * @see org.alfresco.repo.avm.SuperRepository#getStorageRoot() + */ + public String getStorageRoot() + { + return fStorage; + } }