177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair/* 277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Copyright 2008 the original author or authors. 377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * 477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Licensed under the Apache License, Version 2.0 (the "License"); 577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * you may not use this file except in compliance with the License. 677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * You may obtain a copy of the License at 777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * 877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * http://www.apache.org/licenses/LICENSE-2.0 977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * 1077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Unless required by applicable law or agreed to in writing, software 1177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * distributed under the License is distributed on an "AS IS" BASIS, 1277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * See the License for the specific language governing permissions and 1477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * limitations under the License. 1577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair */ 1677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairpackage org.mockftpserver.fake.filesystem; 1777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 1877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport org.apache.log4j.Logger; 1977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport org.mockftpserver.core.util.StringUtil; 2077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 2177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport java.text.DateFormat; 2277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport java.text.SimpleDateFormat; 2377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport java.util.Locale; 2477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 2577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair/** 2677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Unix-specific implementation of the DirectoryListingFormatter interface. 2777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * 2877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * @author Chris Mair 2977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * @version $Revision$ - $Date$ 3077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair */ 3177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairpublic class UnixDirectoryListingFormatter implements DirectoryListingFormatter { 3277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 3377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair private static final Logger LOG = Logger.getLogger(UnixDirectoryListingFormatter.class); 3477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 3577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair private static final String DATE_FORMAT = "MMM dd yyyy"; 3677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair private static final int SIZE_WIDTH = 15; 3777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair private static final int OWNER_WIDTH = 8; 3877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair private static final int GROUP_WIDTH = 8; 3977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair private static final String NONE = "none"; 4077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 4177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair private Locale locale = Locale.ENGLISH; 4277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 4377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair // "-rw-rw-r-- 1 ftp ftp 254 Feb 23 2007 robots.txt" 4477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair // "-rw-r--r-- 1 ftp ftp 30014925 Apr 15 00:19 md5.sums.gz" 4577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair // "-rwxr-xr-x 1 henry users 5778 Dec 1 2005 planaccess.sql" 4677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 4777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair /** 4877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Format the directory listing for a single file/directory entry. 4977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * 5077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * @param fileSystemEntry - the FileSystemEntry for a single file system entry 5177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * @return the formatted directory listing 5277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair */ 5377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair public String format(FileSystemEntry fileSystemEntry) { 5477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair DateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT, locale); 5577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair String dateStr = dateFormat.format(fileSystemEntry.getLastModified()); 5677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair String dirOrFile = fileSystemEntry.isDirectory() ? "d" : "-"; 5777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair Permissions permissions = fileSystemEntry.getPermissions() != null ? fileSystemEntry.getPermissions() : Permissions.DEFAULT; 5877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair String permissionsStr = StringUtil.padRight(permissions.asRwxString(), 9); 5977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair String linkCountStr = "1"; 6077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair String ownerStr = StringUtil.padRight(stringOrNone(fileSystemEntry.getOwner()), OWNER_WIDTH); 6177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair String groupStr = StringUtil.padRight(stringOrNone(fileSystemEntry.getGroup()), GROUP_WIDTH); 6277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair String sizeStr = StringUtil.padLeft(Long.toString(fileSystemEntry.getSize()), SIZE_WIDTH); 6377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair String listing = "" + dirOrFile + permissionsStr + " " + linkCountStr + " " + ownerStr + " " + groupStr + " " + sizeStr + " " + dateStr + " " + fileSystemEntry.getName(); 6477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair LOG.info("listing=[" + listing + "]"); 6577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair return listing; 6677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair } 6777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 6877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair /** 6977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Set the Locale to be used in formatting the date within file/directory listings 7077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * @param locale - the Locale instance 7177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair */ 7277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair public void setLocale(Locale locale) { 7377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair this.locale = locale; 7477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair } 7577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 7677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair private String stringOrNone(String string) { 7777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair return (string == null) ? NONE : string; 7877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair } 7977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair 8077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair}