KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > exoplatform > services > jcr > impl > core > WorkspaceImpl


1 /***************************************************************************
2  * Copyright 2001-2003 The eXo Platform SARL All rights reserved. *
3  * Please look at license.txt in info directory for more license detail. *
4  **************************************************************************/

5
6 package org.exoplatform.services.jcr.impl.core;
7
8 import java.io.ByteArrayInputStream JavaDoc;
9 import java.io.IOException JavaDoc;
10 import java.io.OutputStream JavaDoc;
11 import java.util.ArrayList JavaDoc;
12 import java.util.Iterator JavaDoc;
13 import java.util.List JavaDoc;
14 import java.util.Properties JavaDoc;
15
16 import javax.jcr.ActionVetoedException;
17 import javax.jcr.ItemExistsException;
18 import javax.jcr.NamespaceRegistry;
19 import javax.jcr.Node;
20 import javax.jcr.PathNotFoundException;
21 import javax.jcr.Property;
22 import javax.jcr.PropertyIterator;
23 import javax.jcr.PropertyType;
24 import javax.jcr.RepositoryException;
25 import javax.jcr.Ticket;
26 import javax.jcr.UnsupportedRepositoryOperationException;
27 import javax.jcr.Workspace;
28 import javax.jcr.access.AccessDeniedException;
29 import javax.jcr.access.AccessManager;
30 import javax.jcr.lock.LockCapabilities;
31 import javax.jcr.nodetype.ConstraintViolationException;
32 import javax.jcr.nodetype.NodeTypeManager;
33 import javax.jcr.observation.ObservationManager;
34 import javax.jcr.query.QueryManager;
35 import javax.xml.parsers.SAXParser JavaDoc;
36 import javax.xml.parsers.SAXParserFactory JavaDoc;
37
38 import org.apache.commons.codec.binary.Base64;
39 import org.apache.commons.logging.Log;
40 import org.exoplatform.container.PortalContainer;
41 import org.exoplatform.services.jcr.core.ItemLocation;
42 import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeManagerImpl;
43 import org.exoplatform.services.jcr.impl.core.query.QueryManagerImpl;
44 import org.exoplatform.services.jcr.impl.util.StringConverter;
45 import org.exoplatform.services.jcr.impl.util.XMLWriter;
46 import org.exoplatform.services.jcr.storage.RepositoryManager;
47 import org.exoplatform.services.jcr.storage.WorkspaceContainer;
48 import org.exoplatform.services.jcr.util.PathUtil;
49 import org.exoplatform.services.log.LogUtil;
50 import org.xml.sax.ContentHandler JavaDoc;
51 import org.xml.sax.InputSource JavaDoc;
52 import org.xml.sax.SAXException JavaDoc;
53 import org.xml.sax.XMLReader JavaDoc;
54
55 /**
56  * Created by The eXo Platform SARL .
57  * <p/>
58  * 6.1.4
59  * For the time One workspace for each ticket - simple impl
60  *
61  * @author <a HREF="mailto:geaz@users.sourceforge.net">Gennady Azarenkov</a>
62  * @version $Id: WorkspaceImpl.java,v 1.31 2004/11/02 18:36:33 geaz Exp $
63  */

64
65 public class WorkspaceImpl implements Workspace {
66
67   public static final String JavaDoc ROOT_PATH = "/";
68
69   protected Log log;
70
71   private Ticket ticket;
72   private WorkspaceContainer serverContainer;
73   private String JavaDoc workspaceName;
74
75   public WorkspaceImpl(String JavaDoc workspaceName, Ticket ticket) throws RepositoryException {
76     log = LogUtil.getLog("org.exoplatform.services.jcr");
77     this.workspaceName = workspaceName;
78     this.ticket = ticket;
79     this.serverContainer = ((RepositoryImpl) ticket.getRepository()).getContainer(workspaceName);
80   }
81
82   /**
83    * 6.1.4
84    * Gets the ticket that was used to get this Workspace
85    * object.
86    */

87   public Ticket getTicket() {
88     return ticket;
89   }
90
91
92   /**
93    * Copies the subtree (or node and its properties if <code>shallow</code> is
94    * <code>true</code>) at <code>srcAbsPath</code> to the new location at
95    * <code>destAbsPath</code> in the specified workspace.
96    *
97    * @param srcAbsPath the path of the node to be copied.
98    * @param destAbsPath the location to which the node at <code>srcAbsPath</code>
99    * is to be copied.
100    * @param shallow if true only the node at <code>srcAbsPath</code> and its
101    * properties are copied, otherwise the source node and its entire subtree is copied.
102    * @throws ConstraintViolationException if the copy would violate a
103    * node type or other constraint.
104    * @throws AccessDeniedException if the current ticket (i.e. the ticket that
105    * was used to aqcuire this <code>Workspace</code> object) does not have
106    * sufficient access rights to complete the operation.
107    * @throws PathNotFoundException if the node at <code>srcAbsPath</code> or
108    * the parent of the new node at <code>destAbsPath</code> does not exist.
109    * @throws ItemExistsException if a node or property already exists at
110    * <code>destAbsPath</code>.
111    * @throws ActionVetoedException If a <code>VetoableEventListener</code>
112    * vetoes one of the changes being saved.
113    * @throws RepositoryException if another error occurs.
114    */

115   public void clone(String JavaDoc srcAbsPath, String JavaDoc destAbsPath, String JavaDoc destWorkspace, boolean shallow)
116       throws ConstraintViolationException, AccessDeniedException, PathNotFoundException,
117       ItemExistsException, ActionVetoedException, RepositoryException {
118
119     NodeImpl node = (NodeImpl) serverContainer.getNodeByPath(srcAbsPath);
120
121     if (node == null)
122       throw new PathNotFoundException("Path not found : " + srcAbsPath);
123
124     ItemLocation destLocation = new ItemLocation(destAbsPath, node.getName());
125
126     WorkspaceContainer destContainer = ((RepositoryImpl)ticket.getRepository()).getContainer(destWorkspace);
127
128     log.debug("Clone "+node+" from "+serverContainer.getName()+" to "+destContainer.getName());
129
130     if (destContainer.getNodeByPath(destLocation.getPath()) != null)
131       throw new ItemExistsException("Workspace.clone() failed: destination node'" + destAbsPath +
132           "'already exists in workspace : " + destWorkspace);
133
134     Node newParent = destContainer.getNodeByPath(new ItemLocation(destAbsPath).getPath());
135 // getAncestorPath(1));
136

137     if (newParent == null)
138       throw new PathNotFoundException("Parent for '" + destAbsPath + "' not found.");
139     if (!newParent.getPrimaryNodeType().canAddChildNode(node.getName(), node.getPrimaryNodeType().getName()))
140       throw new ConstraintViolationException("Workspace.clone(): Adding node " + node +
141           " to " + newParent + " is not allowed!");
142
143     List JavaDoc items = new ArrayList JavaDoc();
144     if (shallow)
145       items.add(node);
146     else
147       getRecursively(node, items, serverContainer);
148
149     for (int i = 0; i < items.size(); i++) {
150       NodeImpl item = (NodeImpl) items.get(i);
151       String JavaDoc newPath = destAbsPath+item.getPath();
152       NodeImpl newNode = new NodeImpl(newPath, item.getPermanentProperties());
153       log.debug("Workspace.clone() new node = " + newNode);
154       destContainer.add(newNode);
155
156       Property uuid = newNode.getPermanentProperty("jcr:uuid");
157       if (uuid != null)
158           getRepositoryManager().addLocation(destContainer.getName(), uuid.getString(), newNode.getPath(), true);
159
160 // getRepositoryManager().addPath(destContainer.getName(), uuid.getString(), newNode.getPath());
161

162     }
163
164
165   }
166
167   /**
168    * Moves the node at <code>srcAbsPath</code> (and its entire subtree) to the
169    * new location at <code>destAbsPath</code>.
170    * Throws an exception if
171    * there is already an item at <code>destAbsPath</code>, or if some other
172    * constraint (access, node type, system-level) is violated. If succesful,
173    * the parent of the new node at <code>destAbsPath</code> is "saved" (i.e. the
174    * change is persisted immediately as is the parent of the moved node at its
175    * original location, there is no need to call <code>Node.save()</code>).
176    *
177    * @param srcAbsPath the path of the node to be moved.
178    * @param destAbsPath the location to which the node at <code>srcAbsPath</code>
179    * is to be moved.
180    * @throws ConstraintViolationException if the move would violate a
181    * node type or other constraint.
182    * @throws AccessDeniedException if the current ticket (i.e. the ticket that
183    * was used to aqcuire this <code>Workspace</code> object) does not have
184    * sufficient access rights to complete the operation.
185    * @throws PathNotFoundException if the node at <code>srcAbsPath</code> or
186    * the parent of the new node at <code>destAbsPath</code> does not exist.
187    * @throws ItemExistsException if a node or property already exists at
188    * <code>destAbsPath</code>.
189    * @throws ActionVetoedException If a <code>VetoableEventListener</code>
190    * vetoes one of the changes being saved.
191    * @throws RepositoryException if another error occurs.
192    */

193   public void move(String JavaDoc srcAbsPath, String JavaDoc destAbsPath) throws ConstraintViolationException,
194       AccessDeniedException, PathNotFoundException, ItemExistsException,
195       ActionVetoedException, RepositoryException {
196     copy(srcAbsPath, destAbsPath);
197     List JavaDoc items = new ArrayList JavaDoc();
198     NodeImpl node = (NodeImpl)serverContainer.getNodeByPath(srcAbsPath);
199     getRecursively(node, items, serverContainer);
200     for(int i=0; i<items.size(); i++) {
201        NodeImpl childNode = (NodeImpl)items.get(i);
202        serverContainer.delete(childNode.getPath()); //serverContainer.getNodeByPath(srcAbsPath));
203

204        Property uuid = childNode.getPermanentProperty("jcr:uuid");
205        if (uuid != null)
206            getRepositoryManager().deleteLocationByUUID(serverContainer.getName(), uuid.getString());
207 // getRepositoryManager().deletePath(serverContainer.getName(), uuid.getString());
208

209     }
210     
211   }
212
213   /**
214    * 6.1.4
215    * Returns the QueryManager, which is used to search
216    * the repository.
217    */

218   public QueryManager getQueryManager() {
219     QueryManagerImpl qm = QueryManagerImpl.getInstance();
220     qm.init(this);
221     return qm;
222   }
223
224   /**
225    * 6.1.4
226    * Returns the NodeTypeManager, which is used to
227    * access information about which node types are
228    * available in the repository.
229    */

230   public NodeTypeManager getNodeTypeManager() {
231     return NodeTypeManagerImpl.getInstance();
232   }
233
234
235   /**
236    * 6.1.4
237    * Returns the NamespaceRegistry object, which is
238    * used to set the mapping between namespace
239    * prefixes and URIs.
240    */

241   public NamespaceRegistry getNamespaceRegistry() {
242     return (NamespaceRegistry) PortalContainer.getInstance().
243         getComponentInstanceOfType(NamespaceRegistry.class);
244   }
245
246   /**
247    * In level 2 gets the <code>AccessManager</code>, in level 1 throws
248    * an <code>UnsupportedRepositoryOperationException</code>.
249    * <p/>
250    * <b>Level 1:</b>
251    * <p/>
252    * Always throws an <code>UnsupportedRepositoryOperationException</code> since
253    * access control is not supported in level 1.
254    * <p/>
255    * <b>Level 2:</b>
256    * <p/>
257    * Gets the <code>AccessManager</code> through which access control
258    * information is queried.
259    *
260    * @return an <code>AccessManager</code> object.
261    * @throws UnsupportedRepositoryOperationException
262    * In level 1: Always.
263    * In level 2: Never.
264    */

265   public AccessManager getAccessManager() throws UnsupportedRepositoryOperationException {
266     throw new UnsupportedRepositoryOperationException("Workspace.getAccessManager() is not supported by Level 1 of JCR.");
267   }
268
269
270   /**
271    * <i>If locking is supported</i> returns the
272    * <code>LockCapabilities</code> object, otherwise throws an
273    * <code>UnsupportedRepositoryOperationException</code>.
274    * <p/>
275    * <b>Level 1:</b>
276    * <p/>
277    * Always throws an <code>UnsupportedRepositoryOperationException</code>
278    * since locking is not supported in level 1.
279    * <p/>
280    * <b>Level 2:</b>
281    * <p/>
282    * If locking is supported, returns the <code>LockCapabilities</code>
283    * object through which dynamic discovery of supported locking functionality
284    * is provided. If locking is not supported then this method throws an
285    * <code>UnsupportedRepositoryOperationException</code>.
286    *
287    * @return A <code>LockCapabilities</code> object.
288    * @throws UnsupportedRepositoryOperationException
289    * In level 1: Always.
290    * In level 2: if implementation does not support locking.
291    */

292   public LockCapabilities getLockCapabilities() throws UnsupportedRepositoryOperationException {
293     throw new UnsupportedRepositoryOperationException("Workspace.getLockCapabilities() is not supported by Level 1 of JCR.");
294   }
295
296   /**
297    * If observation is supproted gets the <code>ObservationManager</code>,
298    * otherwisein throws an <code>UnsupportedRepositoryOperationException</code>.
299    * <p/>
300    * <b>Level 1:</b>
301    * <p/>
302    * Always throws an <code>UnsupportedRepositoryOperationException</code> since
303    * observation is not in supported in level 1.
304    * <p/>
305    * <b>Level 2:</b>
306    * <p/>
307    * If observation is supported (it is optional, even in level 2), gets the
308    * <code>ObservationManager</code> object through which event observation
309    * is managed. Otherwise throws an
310    * <code>UnsupportedRepositoryOperationException</code>.
311    *
312    * @return an <code>ObservationManager</code> object.
313    * @throws UnsupportedRepositoryOperationException
314    * In level 1: Always.
315    * In level 2: if implementation doesnot support observation.
316    */

317   public ObservationManager getObservationManager() throws UnsupportedRepositoryOperationException {
318     throw new UnsupportedRepositoryOperationException("Workspace.getObservationManager() is not supported by Level 1 of JCR.");
319   }
320
321
322   /**
323    * 6.1.4
324    * Serializes the node at absPath .
325    */

326   public void exportSysView(String JavaDoc absPath, ContentHandler JavaDoc handler, boolean binaryAsLink, boolean noRecurse)
327       throws PathNotFoundException, SAXException JavaDoc, RepositoryException {
328     NodeImpl node = (NodeImpl) serverContainer.getNodeByPath(absPath);
329     XMLWriter writer = new XMLWriter(((NamespaceRegistryImpl) getNamespaceRegistry()).getURIMap());
330     initNodeAsSysView(node, writer, binaryAsLink, noRecurse);
331
332     invokeHandler(writer.getBytes(), handler);
333   }
334
335   /**
336    * 6.1.4
337    * Serializes the node at absPath .
338    */

339   public void exportSysView(String JavaDoc absPath, OutputStream JavaDoc out, boolean binaryAsLink, boolean noRecurse)
340       throws IOException JavaDoc, PathNotFoundException, RepositoryException {
341     NodeImpl node = (NodeImpl) serverContainer.getNodeByPath(absPath);
342     if (node == null)
343       throw new PathNotFoundException("exportSysView error: node not found at the path '" + absPath + "'");
344
345     XMLWriter writer = new XMLWriter(((NamespaceRegistryImpl) getNamespaceRegistry()).getURIMap());
346     initNodeAsSysView(node, writer, binaryAsLink, noRecurse);
347
348     try {
349       out.write(writer.getBytes());
350     } catch (IOException JavaDoc e) {
351       throw new RepositoryException("Write Sys View failed. Reason: " + e);
352     }
353
354   }
355
356   /**
357    * 6.1.4
358    * Serializes the node at absPath .
359    */

360   public void exportDocView(String JavaDoc absPath, ContentHandler JavaDoc handler, boolean binaryAsLink, boolean noRecurse)
361       throws PathNotFoundException, SAXException JavaDoc, RepositoryException {
362     NodeImpl node = (NodeImpl) serverContainer.getNodeByPath(absPath);
363     XMLWriter writer = new XMLWriter(((NamespaceRegistryImpl) getNamespaceRegistry()).getURIMap());
364     initNodeAsDocView(node, writer, binaryAsLink, noRecurse);
365
366     invokeHandler(writer.getBytes(), handler);
367   }
368
369   private void invokeHandler(byte[] input, ContentHandler JavaDoc contentHandler)
370       throws SAXException JavaDoc, RepositoryException {
371     try {
372       SAXParserFactory JavaDoc factory = SAXParserFactory.newInstance();
373       SAXParser JavaDoc parser = factory.newSAXParser();
374       XMLReader JavaDoc reader = parser.getXMLReader();
375       reader.setContentHandler(contentHandler);
376       reader.parse(new InputSource JavaDoc(new ByteArrayInputStream JavaDoc(input)));
377     } catch (SAXException JavaDoc e) {
378       throw e;
379     } catch (Exception JavaDoc e) {
380       throw new RepositoryException("Can not invoke content handler", e);
381     }
382   }
383
384   /**
385    * 6.1.4
386    * Serializes the node at absPath .
387    */

388   public void exportDocView(String JavaDoc absPath, OutputStream JavaDoc out, boolean binaryAsLink, boolean noRecurse)
389       throws IOException JavaDoc, PathNotFoundException, RepositoryException {
390     NodeImpl node = (NodeImpl) serverContainer.getNodeByPath(absPath);
391     if (node == null)
392       throw new PathNotFoundException("exportDocView error: node not found at the path '" + absPath + "'");
393     XMLWriter writer = new XMLWriter(((NamespaceRegistryImpl) getNamespaceRegistry()).getURIMap());
394     initNodeAsDocView(node, writer, binaryAsLink, noRecurse);
395
396     try {
397       out.write(writer.getBytes());
398     } catch (IOException JavaDoc e) {
399       throw new RepositoryException("Write Doc View failed. Reason: " + e);
400     }
401
402   }
403
404
405   public void copy(String JavaDoc srcPath, String JavaDoc destPath, boolean shallow) throws ItemExistsException,
406       AccessDeniedException, ConstraintViolationException, RepositoryException {
407
408     NodeImpl node = (NodeImpl) serverContainer.getNodeByPath(srcPath);
409
410     if (node == null)
411       throw new PathNotFoundException("Path not found : " + srcPath);
412
413     if (serverContainer.getNodeByPath(destPath) != null)
414       throw new ItemExistsException("Workspace.copy() failed: destination node'" + destPath +
415           "'already exists!");
416
417     Node newParent = serverContainer.getNodeByPath(new ItemLocation(destPath).getAncestorPath(1));
418     if (newParent == null)
419       throw new PathNotFoundException("Parent for '" + destPath + "' not found.");
420     if (!newParent.getPrimaryNodeType().canAddChildNode(node.getName(), node.getPrimaryNodeType().getName()))
421       throw new ConstraintViolationException("Workspace.copy(): Adding node " + node + " to " + newParent + " is not allowed!");
422
423     List JavaDoc items = new ArrayList JavaDoc();
424     if (shallow)
425       items.add(node);
426     else
427       getRecursively(node, items, serverContainer);
428
429     for (int i = 0; i < items.size(); i++) {
430       NodeImpl item = (NodeImpl) items.get(i);
431 // item.setTicket(new DummyTicket(serverContainer));
432
String JavaDoc _path = PathUtil.rewriteSuffix(item.getPath(), srcPath, destPath);
433       List JavaDoc props = new ArrayList JavaDoc();
434       Iterator JavaDoc propertyIterator = item.getPermanentProperties().iterator();
435
436       while (propertyIterator.hasNext()) {
437         PropertyImpl property = (PropertyImpl) propertyIterator.next();
438         String JavaDoc propPath = PathUtil.rewriteSuffix(property.getPath(), srcPath, destPath);
439         log.debug("Workspace.copy() new prop = " + propPath);
440         props.add(new PropertyImpl(propPath, property.getValue(), property.getType()));
441       }
442
443       NodeImpl newNode = new NodeImpl(_path, props);
444 // newNode.setTicket(new DummyTicket(serverContainer));
445
log.debug("Workspace.copy() new node = " + newNode);
446       serverContainer.add(newNode);
447     }
448
449   }
450
451
452   /**
453    * Equivalent to copy(srcPath, destPath, false).
454    * No more in interface!
455    */

456   public void copy(String JavaDoc srcPath, String JavaDoc destPath) throws ItemExistsException, AccessDeniedException, RepositoryException {
457     copy(srcPath, destPath, false);
458   }
459
460
461 /////////////////////////////////////////////
462

463   private void getRecursively(NodeImpl node, List JavaDoc items, WorkspaceContainer c) {
464     log.debug("GET Recursively " + node);
465     items.add(node);
466
467     try {
468
469       List JavaDoc children = c.getChildren(node.getPath());
470       for (int i = 0; i < children.size(); i++) {
471         String JavaDoc path = (String JavaDoc) children.get(i);
472         NodeImpl item = (NodeImpl)c.getNodeByPath(path);
473         getRecursively(item, items, c);
474       }
475     } catch (RepositoryException e) {
476        e.printStackTrace();
477        throw new RuntimeException JavaDoc("NodesStorage.getRecursively() for "+node.getPath()+" FAILED "+e);
478     }
479   }
480
481   // Helper for for node export
482
private void initNodeAsSysView(NodeImpl node, XMLWriter writer, boolean binaryAsLink, boolean noRecurse)
483       throws RepositoryException {
484
485     log.debug("Sys --" + node + " writer: " + writer);
486
487     String JavaDoc name = node.getName();
488
489     if (name.length() == 0) // root node
490
name = "sv:root";
491
492     Properties JavaDoc attrs = new Properties JavaDoc();
493     attrs.setProperty("sv:name", name);
494     writer.startElement("sv:node", attrs);
495
496     PropertyIterator props = node.getProperties();
497     while (props.hasNext()) {
498       PropertyImpl prop = (PropertyImpl) props.next();
499       String JavaDoc strPropVal = getStrPropValue(prop, binaryAsLink);
500       String JavaDoc strPropType;
501       if (prop.getType() == PropertyType.BINARY && binaryAsLink)
502         strPropType = PropertyType.nameFromValue(PropertyType.SOFTLINK).toLowerCase();
503       else
504         strPropType = PropertyType.nameFromValue(prop.getType()).toLowerCase();
505
506       attrs = new Properties JavaDoc();
507       attrs.setProperty("sv:name", prop.getName());
508       attrs.setProperty("sv:type", "pt:" + strPropType);
509       writer.startElement("sv:property", attrs);
510       writer.writeText(strPropVal);
511       writer.endElement();
512     }
513
514     List JavaDoc nodes = serverContainer.getChildren(node.getPath());
515     for (int i = 0; i < nodes.size(); i++) {
516 // NodeImpl child = (NodeImpl) nodes.get(i);
517
String JavaDoc path = (String JavaDoc) nodes.get(i);
518       NodeImpl child = (NodeImpl) serverContainer.getNodeByPath(path);
519       if (!noRecurse)
520         initNodeAsSysView(child, writer, binaryAsLink, noRecurse);
521     }
522     writer.endElement();
523   }
524
525   // Helper for for node export
526
private void initNodeAsDocView(NodeImpl node, XMLWriter writer, boolean binaryAsLink, boolean noRecurse) throws RepositoryException {
527
528     String JavaDoc name = node.getName();
529     if (name.length() == 0) // root node
530
name = "root";
531
532 // buffer.append("<"+name);
533
Properties JavaDoc attrs = new Properties JavaDoc();
534
535     PropertyIterator props = node.getProperties();
536     while (props.hasNext()) {
537       PropertyImpl prop = (PropertyImpl) props.next();
538       String JavaDoc strPropVal = getStrPropValue(prop, binaryAsLink);
539       attrs.setProperty(prop.getName(), strPropVal);
540     }
541     writer.startElement(name, attrs);
542
543     List JavaDoc nodes = serverContainer.getChildren(node.getPath());
544     for (int i = 0; i < nodes.size(); i++) {
545       String JavaDoc path = (String JavaDoc) nodes.get(i);
546       NodeImpl child = (NodeImpl) serverContainer.getNodeByPath(path);
547 // NodeImpl child = (NodeImpl) nodes.get(i);
548
if (!noRecurse)
549         initNodeAsDocView(child, writer, binaryAsLink, noRecurse);
550     }
551
552     writer.endElement();
553   }
554
555   private String JavaDoc getStrPropValue(PropertyImpl prop, boolean binaryAsLink) {
556     if (prop.getType() == PropertyType.BINARY) {
557       if (binaryAsLink)
558         return prop.getPath();
559       else {
560         String JavaDoc str = new String JavaDoc(Base64.encodeBase64(prop.getString().getBytes()));
561         return str;
562       }
563     } else
564       return StringConverter.normalizeString(prop.getString(), false);
565   }
566
567
568   //
569
public WorkspaceContainer getContainer() {
570     return serverContainer;
571   }
572
573   public String JavaDoc getWorkspaceName() {
574     return workspaceName;
575   }
576
577   private RepositoryManager getRepositoryManager() {
578      return ((RepositoryImpl)ticket.getRepository()).getRepositoryManager();
579   }
580
581 }
582
Popular Tags