Added: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/AssetsHolder.java URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/AssetsHolder.java?rev=371786&view=auto ============================================================================== --- jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/AssetsHolder.java (added) +++ jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/AssetsHolder.java Mon Jan 23 19:04:45 2006 @@ -0,0 +1,74 @@ +// Copyright 2004, 2005 The Apache Software Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// 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.apache.tapestry.ajaxworkbench.tree.examples.fsmodel; + +import org.apache.hivemind.impl.DefaultClassResolver; +import org.apache.hivemind.util.ClasspathResource; +import org.apache.hivemind.util.Defense; +import org.apache.tapestry.asset.PrivateAsset; +import org.apache.tapestry.engine.IEngineService; + +/** + * @author ceco + */ +public class AssetsHolder +{ + private final IEngineService _assetService; + + private final String m_strOpenAssetsURL; + + private final String m_strCloseAssetsURL; + + private PrivateAsset m_objOpenAsset = null; + + private PrivateAsset m_objCloseAsset = null; + + /** + * Constructor for AssetsHolder. + */ + public AssetsHolder(IEngineService assetService, String strOpenAssetsURL, + String strCloseAssetsURL) + { + Defense.notNull(assetService, "assetService"); + + _assetService = assetService; + + m_strOpenAssetsURL = strOpenAssetsURL; + m_strCloseAssetsURL = strCloseAssetsURL; + } + + public PrivateAsset getAssetForOpenNode() + { + if (m_objOpenAsset == null) + { + // m_objOpenAsset = new PrivateAsset(m_strOpenAssetsURL); + m_objOpenAsset = new PrivateAsset(new ClasspathResource(new DefaultClassResolver(), + m_strOpenAssetsURL), _assetService, null); + } + return m_objOpenAsset; + } + + public PrivateAsset getAssetForCloseNode() + { + if (m_objCloseAsset == null) + { + // m_objCloseAsset = new PrivateAsset(m_strCloseAssetsURL); + m_objCloseAsset = new PrivateAsset(new ClasspathResource(new DefaultClassResolver(), + m_strCloseAssetsURL), _assetService, null); + } + return m_objCloseAsset; + } + +}
Added: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/Drive.java URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/Drive.java?rev=371786&view=auto ============================================================================== --- jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/Drive.java (added) +++ jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/Drive.java Mon Jan 23 19:04:45 2006 @@ -0,0 +1,67 @@ +// Copyright 2004, 2005, 2006 The Apache Software Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// 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.apache.tapestry.ajaxworkbench.tree.examples.fsmodel; + +import java.io.File; + +import org.apache.tapestry.contrib.tree.model.ITreeNode; +import org.apache.tapestry.engine.IEngineService; + +/** @author tsv? * */ +public class Drive extends FolderObject +{ + private static final long serialVersionUID = -4098885307563692077L; + + private String m_strType; + + private String m_strLabel; + + private long m_lSize; + + private final IEngineService _assetService; + + public Drive(ITreeNode objParent, File objFile, IEngineService assetService) + { + super(objParent, objFile, false, assetService); + + _assetService = assetService; + } + + public long getSize() + { + return m_lSize; + } + + public String getType() + { + return m_strType; + } + + public String getLabel() + { + return m_strLabel; + } + + public AssetsHolder getAssets() + { + if (m_objAssetsHolder == null) + { + m_objAssetsHolder = new AssetsHolder(_assetService, + "/org/apache/tapestry/workbench/tree/examples/fsmodel/harddrive.gif", + "/org/apache/tapestry/workbench/tree/examples/fsmodel/harddrive.gif"); + } + return m_objAssetsHolder; + } +} Added: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/FileObject.java URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/FileObject.java?rev=371786&view=auto ============================================================================== --- jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/FileObject.java (added) +++ jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/FileObject.java Mon Jan 23 19:04:45 2006 @@ -0,0 +1,104 @@ +// Copyright 2004, 2005, 2006 The Apache Software Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// 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.apache.tapestry.ajaxworkbench.tree.examples.fsmodel; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; + +import org.apache.tapestry.contrib.tree.model.ITreeNode; +import org.apache.tapestry.engine.IEngineService; + +/** @author tsv? * */ +public class FileObject extends SFObject +{ + + private static final long serialVersionUID = -4552981105079058185L; + + private long m_lSize; + + private final IEngineService _assetService; + + public FileObject(ITreeNode objParent, File objFile, IEngineService assetService) + { + super(objParent, objFile); + _assetService = assetService; + init(); + } + + protected void init() + { + super.init(); + m_lSize = m_objFile.length(); + } + + public long getSize() + { + return m_lSize; + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeNode#containsChild(ITreeNode) + */ + public boolean containsChild(ITreeNode node) + { + return false; + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeNode#getAllowsChildren() + */ + public boolean getAllowsChildren() + { + return false; + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeNode#getChildCount() + */ + public int getChildCount() + { + return 0; + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeNode#getChildren() + */ + public Collection getChildren() + { + return new ArrayList(); + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeNode#isLeaf() + */ + public boolean isLeaf() + { + return true; + } + + /** + * @see org.apache.tapestry.ajaxworkbench.tree.examples.fsmodel.IFileSystemTreeNode#getAssets() + */ + public AssetsHolder getAssets() + { + if (m_objAssetsHolder == null) + { + final String a = "/org/apache/tapestry/workbench/tree/examples/fsmodel/file.gif"; + m_objAssetsHolder = new AssetsHolder(_assetService, a, a); + } + return m_objAssetsHolder; + } +} Added: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/FileSystem.java URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/FileSystem.java?rev=371786&view=auto ============================================================================== --- jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/FileSystem.java (added) +++ jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/FileSystem.java Mon Jan 23 19:04:45 2006 @@ -0,0 +1,189 @@ +// Copyright 2004, 2005, 2006 The Apache Software Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// 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.apache.tapestry.ajaxworkbench.tree.examples.fsmodel; + +import java.io.File; +import java.util.Collection; +import java.util.Date; +import java.util.Vector; + +import org.apache.tapestry.contrib.tree.model.ITreeNode; +import org.apache.tapestry.engine.IEngineService; + +/** @author tsv? */ +public class FileSystem implements IFileSystemTreeNode +{ + + private static final long serialVersionUID = -3895257178984217762L; + + private transient AssetsHolder m_objAssetsHolder = null; + + /** + * @associates <{Drive}> + * @supplierCardinality 0..* + * @link aggregation + */ + private Vector m_vDrives; + + private final IEngineService _assetService; + + public FileSystem(IEngineService assetService) + { + _assetService = assetService; + } + + private void initDrives() + { + m_vDrives = new Vector(); + File[] arrFile = File.listRoots(); + + if (arrFile != null) for(int i = 0; i < arrFile.length; i++) + { + File objFile = arrFile[i]; + boolean bFloppy = objFile.getAbsolutePath().startsWith("A:") || objFile.getAbsolutePath().startsWith("B:"); + if (!bFloppy) m_vDrives.addElement(new Drive(this, objFile, _assetService)); + } + } + + public Vector getDrives() + { + if (m_vDrives == null) + { + initDrives(); + } + return m_vDrives; + } + + public int getChildNumber(Object objChild) + { + for(int i = 0; i < m_vDrives.size(); i++) + { + Object objChildDrive = m_vDrives.elementAt(i); + if (objChildDrive.equals(objChild)) { return i; } + } + return -1; + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeNode#containsChild(ITreeNode) + */ + public boolean containsChild(ITreeNode node) + { + return true; + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeNode#getAllowsChildren() + */ + public boolean getAllowsChildren() + { + return true; + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeNode#getChildCount() + */ + public int getChildCount() + { + return getDrives().size(); + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeNode#getChildren() + */ + public Collection getChildren() + { + return getDrives(); + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeNode#getParent() + */ + public ITreeNode getParent() + { + return null; + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeNode#isLeaf() + */ + public boolean isLeaf() + { + return false; + } + + /** + * @see java.lang.Object#toString() + */ + public String toString() + { + return getName(); + } + + public String getName() + { + return "FileSystem"; + } + + /** + * @see java.lang.Object#equals(Object) + */ + public boolean equals(Object arg0) + { + if (!(arg0 instanceof FileSystem)) return false; + FileSystem objFileSystem = (FileSystem)arg0; + if (getName().equals(objFileSystem.getName())) return true; + return false; + } + + /** + * @see java.lang.Object#hashCode() + */ + public int hashCode() + { + return getName().hashCode(); + } + + /** + * @see org.apache.tapestry.ajaxworkbench.tree.examples.fsmodel.IFileSystemTreeNode#getAbsolutePath() + */ + public String getAbsolutePath() + { + return ""; + } + + /** + * @see org.apache.tapestry.ajaxworkbench.tree.examples.fsmodel.IFileSystemTreeNode#getAssets() + */ + public AssetsHolder getAssets() + { + if (m_objAssetsHolder == null) + { + m_objAssetsHolder = new AssetsHolder(_assetService, + "/org/apache/tapestry/workbench/tree/examples/fsmodel/computer.gif", + "/org/apache/tapestry/workbench/tree/examples/fsmodel/computer.gif"); + } + return m_objAssetsHolder; + } + + /** + * @see org.apache.tapestry.ajaxworkbench.tree.examples.fsmodel.IFileSystemTreeNode#getObjectDate() + */ + public Date getDate() + { + return null; + } + +} Added: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/FileSystemDataModel.java URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/FileSystemDataModel.java?rev=371786&view=auto ============================================================================== --- jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/FileSystemDataModel.java (added) +++ jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/FileSystemDataModel.java Mon Jan 23 19:04:45 2006 @@ -0,0 +1,107 @@ +// Copyright 2004, 2005, 2006 The Apache Software Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// 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.apache.tapestry.ajaxworkbench.tree.examples.fsmodel; + +import java.io.Serializable; +import java.util.Iterator; + +import org.apache.tapestry.contrib.tree.model.ITreeNode; +import org.apache.tapestry.contrib.tree.simple.SimpleTreeDataModel; + +/** + * @author ceco + */ +public class FileSystemDataModel extends SimpleTreeDataModel implements Serializable +{ + + private static final long serialVersionUID = 2384273235598992452L; + + /** + * Constructor for FileSystemDataModel. + * + * @param objRootNode + */ + public FileSystemDataModel(ITreeNode objRootNode) + { + super(objRootNode); + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeDataModel#getObject(Object) + */ + public Object getObject(Object objUniqueKey) + { + return findNode(objUniqueKey, (IFileSystemTreeNode)getRoot()); + } + + private IFileSystemTreeNode findNode(Object objUniqueKey, IFileSystemTreeNode objParentNode) + { + String strUniqueKey = (String)objUniqueKey; + String strParentUniqueKey = objParentNode.getAbsolutePath(); + + if (strUniqueKey.equals(strParentUniqueKey)) { return objParentNode; } + + IFileSystemTreeNode obj = null; + + if (strUniqueKey.startsWith(strParentUniqueKey)) + { + for(Iterator iter = objParentNode.getChildren().iterator(); iter.hasNext();) + { + IFileSystemTreeNode element = (IFileSystemTreeNode)iter.next(); + obj = findNode(objUniqueKey, element); + if (obj != null) + { + break; + } + } + } + + return obj; + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeDataModel#getUniqueKey(Object, + * Object) + */ + public Object getUniqueKey(Object objTarget, Object objParentUniqueKey) + { + IFileSystemTreeNode objNode = (IFileSystemTreeNode)objTarget; + return objNode.getAbsolutePath(); + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeDataModel#isAncestorOf(Object, + * Object) + */ + public boolean isAncestorOf(Object objChildUniqueKey, Object objParentUniqueKey) + { + String strChildAbsolutePath = (String)objChildUniqueKey; + String strParentAbsolutePath = (String)objParentUniqueKey; + + if ("".equals(strParentAbsolutePath)) { return true; } + + return strChildAbsolutePath.lastIndexOf(strParentAbsolutePath) > -1; + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeDataModel#getParentUniqueKey(Object) + */ + public Object getParentUniqueKey(Object objChildUniqueKey) + { + IFileSystemTreeNode objNode = (IFileSystemTreeNode)getObject(objChildUniqueKey); + return objNode.getParent(); + } + +} Added: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/FileSystemStateManager.java URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/FileSystemStateManager.java?rev=371786&view=auto ============================================================================== --- jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/FileSystemStateManager.java (added) +++ jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/FileSystemStateManager.java Mon Jan 23 19:04:45 2006 @@ -0,0 +1,79 @@ +// Copyright 2004, 2005 The Apache Software Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// 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.apache.tapestry.ajaxworkbench.tree.examples.fsmodel; + +import java.io.File; + +import org.apache.tapestry.contrib.tree.model.ITreeDataModel; +import org.apache.tapestry.contrib.tree.model.ITreeModel; +import org.apache.tapestry.contrib.tree.model.ITreeNode; +import org.apache.tapestry.contrib.tree.model.ITreeSessionStateManager; +import org.apache.tapestry.contrib.tree.model.ITreeStateModel; +import org.apache.tapestry.contrib.tree.simple.SimpleTreeModel; +import org.apache.tapestry.engine.IEngineService; + +/** + * @author ceco + */ +public class FileSystemStateManager implements ITreeSessionStateManager +{ + private String m_strRootDir; + + private final IEngineService _assetService; + + /** + * Constructor for FileSystemStateManager. + */ + public FileSystemStateManager(String strRootDir, IEngineService assetService) + { + super(); + m_strRootDir = strRootDir; + _assetService = assetService; + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeSessionStateManager#getSessionState(ITreeModel) + */ + public Object getSessionState(ITreeModel objModel) + { + return objModel.getTreeStateModel(); + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeSessionStateManager#getModel(Object) + */ + public ITreeModel getModel(Object objSessionState) + { + ITreeStateModel objStateModel = (ITreeStateModel) objSessionState; + + ITreeNode objParent; + + if (m_strRootDir == null || "".equals(m_strRootDir)) + { + objParent = new FileSystem(_assetService); + } + else + { + FolderObject objFolder = new FolderObject(null, new File(m_strRootDir), true, _assetService); + objFolder.reload(); + objParent = objFolder; + } + + ITreeDataModel objDataModel = new FileSystemDataModel(objParent); + ITreeModel objModel = new SimpleTreeModel(objDataModel, objStateModel); + + return objModel; + } +} Added: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/FolderObject.java URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/FolderObject.java?rev=371786&view=auto ============================================================================== --- jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/FolderObject.java (added) +++ jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/FolderObject.java Mon Jan 23 19:04:45 2006 @@ -0,0 +1,168 @@ +// Copyright 2004, 2005, 2006 The Apache Software Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// 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.apache.tapestry.ajaxworkbench.tree.examples.fsmodel; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Vector; + +import org.apache.tapestry.contrib.tree.model.ITreeNode; +import org.apache.tapestry.engine.IEngineService; + +/** @author tsv? */ +public class FolderObject extends SFObject +{ + + private static final long serialVersionUID = 1889745019885512018L; + + /** + * @associates <{File}> + * @supplierCardinality 0..* + * @link aggregation + */ + private Vector m_vFiles = null; + + /** + * @associates <{FolderObject}> + * @supplierCardinality 0..* + * @link aggregation + */ + private Vector m_vFolders = null; + + private boolean m_bShared; + + private final IEngineService _assetService; + + public FolderObject(ITreeNode objParent, File objFile, boolean bInvokeInit, IEngineService assetService) + { + super(objParent, objFile); + + _assetService = assetService; + + if (bInvokeInit) init(); + } + + public void reload() + { + m_vFolders = new Vector(); + m_vFiles = new Vector(); + + File[] arrFiles = getFile().listFiles(); + + if (arrFiles == null) { return; } + + for(int i = 0; i < arrFiles.length; i++) + { + if (arrFiles[i].isDirectory()) + { + m_vFolders.addElement(new FolderObject(this, arrFiles[i], true, _assetService)); + } + else + { + m_vFiles.addElement(new FileObject(this, arrFiles[i], _assetService)); + } + } + } + + public boolean isShared() + { + return m_bShared; + } + + public Vector getFolders() + { + if (m_vFolders == null) + { + reload(); + } + return m_vFolders; + } + + public Vector getFiles() + { + if (m_vFiles == null) + { + reload(); + } + return m_vFiles; + } + + public int getChildNumber(Object objChild) + { + for(int i = 0; i < m_vFolders.size(); i++) + { + Object objChildFolder = m_vFolders.elementAt(i); + if (objChildFolder.equals(objChild)) { return i; } + } + return -1; + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeNode#containsChild(ITreeNode) + */ + public boolean containsChild(ITreeNode node) + { + return true; + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeNode#getAllowsChildren() + */ + public boolean getAllowsChildren() + { + return true; + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeNode#getChildCount() + */ + public int getChildCount() + { + return getFolders().size() + getFiles().size(); + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeNode#getChildren() + */ + public Collection getChildren() + { + ArrayList arrChildrens = new ArrayList(); + arrChildrens.addAll(getFolders()); + arrChildrens.addAll(getFiles()); + return arrChildrens; + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeNode#isLeaf() + */ + public boolean isLeaf() + { + return false; + } + + private final static String openImage = "/org/apache/tapestry/workbench/tree/examples/fsmodel/TreeOpen.gif"; + + private final static String closedImage = "/org/apache/tapestry/workbench/tree/examples/fsmodel/TreeClosed.gif"; + + public AssetsHolder getAssets() + { + if (m_objAssetsHolder == null) + { + m_objAssetsHolder = new AssetsHolder(_assetService, openImage, closedImage); + } + return m_objAssetsHolder; + } +} Added: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/IFileSystemTreeNode.java URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/IFileSystemTreeNode.java?rev=371786&view=auto ============================================================================== --- jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/IFileSystemTreeNode.java (added) +++ jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/IFileSystemTreeNode.java Mon Jan 23 19:04:45 2006 @@ -0,0 +1,28 @@ +// Copyright 2004, 2005 The Apache Software Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// 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.apache.tapestry.ajaxworkbench.tree.examples.fsmodel; + +import java.util.Date; + +import org.apache.tapestry.contrib.tree.model.ITreeNode; + +/** + * @author ceco + */ +public interface IFileSystemTreeNode extends ITreeNode { + String getAbsolutePath(); + AssetsHolder getAssets(); + Date getDate(); +} Added: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/NodeRenderFactory.java URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/NodeRenderFactory.java?rev=371786&view=auto ============================================================================== --- jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/NodeRenderFactory.java (added) +++ jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/NodeRenderFactory.java Mon Jan 23 19:04:45 2006 @@ -0,0 +1,120 @@ +// Copyright 2004, 2005, 2006 The Apache Software Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// 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.apache.tapestry.ajaxworkbench.tree.examples.fsmodel; + +import org.apache.tapestry.IMarkupWriter; +import org.apache.tapestry.IRender; +import org.apache.tapestry.IRequestCycle; +import org.apache.tapestry.asset.PrivateAsset; +import org.apache.tapestry.contrib.tree.components.INodeRenderFactory; +import org.apache.tapestry.contrib.tree.model.ITreeDataModel; +import org.apache.tapestry.contrib.tree.model.ITreeModelSource; +import org.apache.tapestry.contrib.tree.model.ITreeStateModel; + +/** + * @author ceco + */ +public class NodeRenderFactory implements INodeRenderFactory +{ + + /** + * Constructor for NodeRenderFactory. + */ + public NodeRenderFactory() + { + super(); + } + + public IRender getRenderByID(Object objUniqueKey, ITreeModelSource objTreeModelSource, IRequestCycle objCycle) + { + Object objValue = objTreeModelSource.getTreeModel().getTreeDataModel().getObject(objUniqueKey); + return getRender(objValue, objTreeModelSource, objCycle); + } + + public IRender getRender(Object objValue, ITreeModelSource objTreeModelSource, IRequestCycle objCycle) + { + return new CFileSystemRender(objValue, objTreeModelSource); + } + + /** Renders a file system? */ + + public class CFileSystemRender implements IRender + { + + private Object m_objNode; + private ITreeModelSource m_objTreeModelSource; + + public CFileSystemRender(Object objNode, ITreeModelSource objTreeModelSource) + { + super(); + m_objNode = objNode; + m_objTreeModelSource = objTreeModelSource; + } + + public boolean isOpen() + { + ITreeDataModel objDataModel = m_objTreeModelSource.getTreeModel().getTreeDataModel(); + ITreeStateModel objStateModel = m_objTreeModelSource.getTreeModel().getTreeStateModel(); + Object objUniqueKey = objDataModel.getUniqueKey(m_objNode, null); + return objStateModel.isUniqueKeyExpanded(objUniqueKey); + } + + public boolean isSelected() + { + ITreeDataModel objDataModel = m_objTreeModelSource.getTreeModel().getTreeDataModel(); + ITreeStateModel objStateModel = m_objTreeModelSource.getTreeModel().getTreeStateModel(); + Object objUniqueKey = objDataModel.getUniqueKey(m_objNode, null); + return objUniqueKey.equals(objStateModel.getSelectedNode()); + } + + public void render(IMarkupWriter objWriter, IRequestCycle objCycle) + { + PrivateAsset objAsset = getAsset(); + objWriter.begin("img"); + objWriter.attribute("border", "0"); + objWriter.attribute("src", objAsset.buildURL()); + objWriter.attribute("valign", "middle"); + objWriter.end(); + objWriter.print(" "); + objWriter.begin("span"); + String strClassName = "fsNodeValue"; + objWriter.attribute("class", strClassName); + objWriter.closeTag(); + objWriter.print(getNode().toString().trim()); + objWriter.end(); + } + + public IFileSystemTreeNode getNode() + { + return (IFileSystemTreeNode)m_objNode; + } + + private PrivateAsset getAsset() + { + PrivateAsset objAsset; + + if (!isOpen()) + { + objAsset = getNode().getAssets().getAssetForCloseNode(); + } + else + { + objAsset = getNode().getAssets().getAssetForOpenNode(); + } + + return objAsset; + } + } +} Added: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/SFObject.java URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/SFObject.java?rev=371786&view=auto ============================================================================== --- jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/SFObject.java (added) +++ jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/SFObject.java Mon Jan 23 19:04:45 2006 @@ -0,0 +1,149 @@ +// Copyright 2004, 2005, 2006 The Apache Software Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// 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.apache.tapestry.ajaxworkbench.tree.examples.fsmodel; + +import java.io.File; +import java.util.Collection; +import java.util.Date; + +import org.apache.tapestry.contrib.tree.model.ITreeNode; + +/** + * @author tsv? + */ +public abstract class SFObject implements IFileSystemTreeNode +{ + + protected File m_objFile; + protected ITreeNode m_objParent; + private Date m_objDate; + protected transient AssetsHolder m_objAssetsHolder = null; + + public SFObject(ITreeNode objParent, File objFile) + { + m_objParent = objParent; + m_objFile = objFile; + // init(); + } + + protected void init() + { + if (m_objFile.isFile() || m_objFile.isDirectory()) m_objDate = new Date(m_objFile.lastModified()); + } + + public String getName() + { + if (m_objFile.getName().equals("")) { return m_objFile.toString(); } + return m_objFile.getName(); + } + + public Date getDate() + { + return m_objDate; + } + + public Object getAttributes() + { + return null; + } + + protected File getFile() + { + return m_objFile; + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeNode#getParent() + */ + public ITreeNode getParent() + { + return m_objParent; + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeNode#containsChild(ITreeNode) + */ + public boolean containsChild(ITreeNode node) + { + return false; + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeNode#getAllowsChildren() + */ + public boolean getAllowsChildren() + { + return false; + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeNode#getChildCount() + */ + public int getChildCount() + { + return 0; + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeNode#getChildren() + */ + public Collection getChildren() + { + return null; + } + + /** + * @see org.apache.tapestry.contrib.tree.model.ITreeNode#isLeaf() + */ + public boolean isLeaf() + { + return false; + } + + /** + * @see java.lang.Object#equals(Object) + */ + public boolean equals(Object arg0) + { + if (!(arg0 instanceof SFObject)) { return false; } + SFObject objSF = (SFObject)arg0; + if (getFile().equals(objSF.getFile())) { return true; } + return false; + } + + /** + * @see java.lang.Object#hashCode() + */ + public int hashCode() + { + return m_objFile.hashCode(); + } + + /** + * @see java.lang.Object#toString() + */ + public String toString() + { + return getName(); + } + + /** + * @see org.apache.tapestry.ajaxworkbench.tree.examples.fsmodel.IFileSystemTreeNode#getAbsolutePath() + */ + public String getAbsolutePath() + { + return getFile().getAbsolutePath(); + } +} Added: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/TreeClosed.gif URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/TreeClosed.gif?rev=371786&view=auto ============================================================================== Binary file - no diff available. Propchange: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/TreeClosed.gif ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/TreeOpen.gif URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/TreeOpen.gif?rev=371786&view=auto ============================================================================== Binary file - no diff available. Propchange: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/TreeOpen.gif ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/computer.gif URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/computer.gif?rev=371786&view=auto ============================================================================== Binary file - no diff available. Propchange: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/computer.gif ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/file.gif URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/file.gif?rev=371786&view=auto ============================================================================== Binary file - no diff available. Propchange: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/file.gif ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/harddrive.gif URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/harddrive.gif?rev=371786&view=auto ============================================================================== Binary file - no diff available. Propchange: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/tree/examples/fsmodel/harddrive.gif ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/upload/Upload.java URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/upload/Upload.java?rev=371786&view=auto ============================================================================== --- jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/upload/Upload.java (added) +++ jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/upload/Upload.java Mon Jan 23 19:04:45 2006 @@ -0,0 +1,63 @@ +// Copyright 2004, 2005, 2006 The Apache Software Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// 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.apache.tapestry.ajaxworkbench.upload; + +import org.apache.tapestry.annotations.InjectPage; +import org.apache.tapestry.form.IPropertySelectionModel; +import org.apache.tapestry.form.StringPropertySelectionModel; +import org.apache.tapestry.html.BasePage; +import org.apache.tapestry.request.IUploadFile; +import org.apache.tapestry.valid.IValidationDelegate; + +/** + * Contains a form, including an [EMAIL PROTECTED] org.apache.tapestry.form.Upload}component. + * + * @author Howard Lewis Ship + */ + +public abstract class Upload extends BasePage +{ + + private static final String[] BPL_OPTIONS = new String[] { "8", "16", "24", "32", "40", "48" }; + + private IPropertySelectionModel bplModel; + + public abstract IUploadFile getFile(); + + public abstract boolean isShowAscii(); + + public abstract String getBytesPerLine(); + + public abstract IValidationDelegate getDelegate(); + + @InjectPage("UploadResults") + public abstract UploadResults getUploadResults(); + + public void doSubmit() + { + IUploadFile file = getFile(); + + UploadResults results = getUploadResults(); + + results.activate(file, isShowAscii(), Integer.parseInt(getBytesPerLine())); + } + + public IPropertySelectionModel getBytesPerLineModel() + { + if (bplModel == null) bplModel = new StringPropertySelectionModel(BPL_OPTIONS); + + return bplModel; + } +} Added: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/upload/UploadResults.java URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/upload/UploadResults.java?rev=371786&view=auto ============================================================================== --- jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/upload/UploadResults.java (added) +++ jakarta/tapestry/trunk/examples/AjaxWorkbench/src/java/org/apache/tapestry/ajaxworkbench/upload/UploadResults.java Mon Jan 23 19:04:45 2006 @@ -0,0 +1,136 @@ +// Copyright 2004, 2005, 2006 The Apache Software Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// 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.apache.tapestry.ajaxworkbench.upload; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.StringWriter; +import java.io.Writer; + +import org.apache.hivemind.ApplicationRuntimeException; +import org.apache.tapestry.html.BasePage; +import org.apache.tapestry.request.IUploadFile; +import org.apache.tapestry.util.io.BinaryDumpOutputStream; + +/** + * Displays the uploaded file as a hexadecimal dump. + * + * @author Howard Lewis Ship + */ + +public abstract class UploadResults extends BasePage +{ + + public abstract void setFile(IUploadFile file); + + public abstract void setFileDump(String fileDump); + + public void activate(IUploadFile file, boolean showAscii, int bytesPerLine) + { + setFile(file); + + StringWriter writer = null; + BinaryDumpOutputStream out = null; + InputStream in = null; + + try + { + in = file.getStream(); + + writer = new StringWriter(); + out = new BinaryDumpOutputStream(writer); + + out.setShowAscii(showAscii); + out.setBytesPerLine(bytesPerLine); + + byte[] buffer = new byte[1000]; + + while(true) + { + int length = in.read(buffer); + + if (length < 0) break; + + out.write(buffer, 0, length); + } + + in.close(); + in = null; + + out.close(); + out = null; + + setFileDump(writer.getBuffer().toString()); + + writer.close(); + writer = null; + } + catch (IOException ex) + { + throw new ApplicationRuntimeException("Unable to display file.", this, null, ex); + } + finally + { + close(in); + close(out); + close(writer); + } + + getRequestCycle().activate(this); + } + + private void close(InputStream stream) + { + if (stream != null) + { + try + { + stream.close(); + } + catch (IOException ex) + { + } + } + } + + private void close(OutputStream stream) + { + if (stream != null) + { + try + { + stream.close(); + } + catch (IOException ex) + { + } + } + } + + private void close(Writer writer) + { + if (writer != null) + { + try + { + writer.close(); + } + catch (IOException ex) + { + } + } + } +} Added: jakarta/tapestry/trunk/examples/AjaxWorkbench/src/test/README.txt URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/AjaxWorkbench/src/test/README.txt?rev=371786&view=auto ============================================================================== --- jakarta/tapestry/trunk/examples/AjaxWorkbench/src/test/README.txt (added) +++ jakarta/tapestry/trunk/examples/AjaxWorkbench/src/test/README.txt Mon Jan 23 19:04:45 2006 @@ -0,0 +1 @@ +A placeholder. The HiveBuild macros currently expect there to be a src/test even if the module contains no tests. \ No newline at end of file Modified: jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/tree/examples/fsmodel/FolderObject.java URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/tree/examples/fsmodel/FolderObject.java?rev=371786&r1=371785&r2=371786&view=diff ============================================================================== --- jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/tree/examples/fsmodel/FolderObject.java (original) +++ jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/tree/examples/fsmodel/FolderObject.java Mon Jan 23 19:04:45 2006 @@ -28,6 +28,10 @@ private static final long serialVersionUID = 1889745019885512018L; + private static final String OPEN_IMAGE = "/org/apache/tapestry/workbench/tree/examples/fsmodel/TreeOpen.gif"; + + private static final String CLOSED_IMAGE = "/org/apache/tapestry/workbench/tree/examples/fsmodel/TreeClosed.gif"; + /** * @associates <{File}> * @supplierCardinality 0..* @@ -153,15 +157,11 @@ return false; } - private final static String openImage = "/org/apache/tapestry/workbench/tree/examples/fsmodel/TreeOpen.gif"; - - private final static String closedImage = "/org/apache/tapestry/workbench/tree/examples/fsmodel/TreeClosed.gif"; - public AssetsHolder getAssets() { if (m_objAssetsHolder == null) { - m_objAssetsHolder = new AssetsHolder(_assetService, openImage, closedImage); + m_objAssetsHolder = new AssetsHolder(_assetService, OPEN_IMAGE, CLOSED_IMAGE); } return m_objAssetsHolder; } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
