001package org.unix4j.unix.ls;
002
003import java.io.File;
004import java.io.IOException;
005import java.nio.file.Files;
006import java.nio.file.attribute.PosixFileAttributeView;
007import java.nio.file.attribute.PosixFilePermission;
008import java.util.Set;
009
010import org.unix4j.util.StringUtil;
011
012/**
013 * Long format for java 7.
014 */
015/* NOTE: must be public for reflection */
016public class LsFormatterLong7 extends LsFormatterLong {
017        
018        public LsFormatterLong7() {
019                //force loading the java7 Files class here to provoke an error if it is a jdk < 7
020                if (Files.class.getName().length() == 0) {
021                        throw new NoClassDefFoundError("internal error: " + getClass().getName());
022                }
023        }
024
025        @Override
026        protected String getOwner(File file, LsArguments args) {
027                try {
028                        final String owner = Files.getOwner(file.toPath()).getName();
029                        return StringUtil.fixSizeString(7, true, owner);
030                } catch (IOException e) {
031                        return super.getOwner(file, args);
032                }
033        }
034
035        @Override
036        protected String getGroup(File file, LsArguments args) {
037                try {
038                        final PosixFileAttributeView view = Files.getFileAttributeView(file.toPath(), PosixFileAttributeView.class);
039                        final String group = view.readAttributes().group().getName();
040                        return StringUtil.fixSizeString(7, true, group);
041                } catch (Exception e) {
042                        return super.getGroup(file, args);
043                }
044        }
045
046        @Override
047        protected String getFilePermissions(File file, LsArguments args) {
048                try {
049                        final Set<PosixFilePermission> perms = Files.getPosixFilePermissions(file.toPath());
050                        return (file.isDirectory() ? "d" : "-") +
051                                (perms.contains(PosixFilePermission.OWNER_READ) ? 'r' : '-') + 
052                                (perms.contains(PosixFilePermission.OWNER_WRITE) ? 'w' : '-') + 
053                                (perms.contains(PosixFilePermission.OWNER_EXECUTE) ? 'x' : '-') + 
054                                (perms.contains(PosixFilePermission.GROUP_READ) ? 'r' : '-') + 
055                                (perms.contains(PosixFilePermission.GROUP_WRITE) ? 'w' : '-') + 
056                                (perms.contains(PosixFilePermission.GROUP_EXECUTE) ? 'x' : '-') + 
057                                (perms.contains(PosixFilePermission.OTHERS_READ) ? 'r' : '-') + 
058                                (perms.contains(PosixFilePermission.OTHERS_WRITE) ? 'w' : '-') + 
059                                (perms.contains(PosixFilePermission.OTHERS_EXECUTE) ? 'x' : '-');
060                } catch (Exception e) {
061                        return super.getFilePermissions(file, args);
062                }
063        }
064        
065        @Override
066        protected long getLastModifiedMS(File file, LsArguments args) {
067                try {
068                        return Files.getLastModifiedTime(file.toPath()).toMillis();
069                } catch (Exception e) {
070                        return super.getLastModifiedMS(file, args);
071                }
072        }
073        
074        @Override
075        protected String getSize(File file, LsArguments args) {
076                final long size;
077                try {
078                        size = Files.size(file.toPath());
079                } catch (Exception e) {
080                        return super.getSize(file, args);
081                }
082                final String sizeString = LsCommand.getSizeString(args, size);
083                return StringUtil.fixSizeString(maxSizeStringLength.get(), false, sizeString);
084        }
085}