001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     *
010     *     http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    package org.apache.hadoop.fs;
019    
020    import java.io.DataInput;
021    import java.io.DataOutput;
022    import java.io.IOException;
023    
024    import org.apache.hadoop.classification.InterfaceAudience;
025    import org.apache.hadoop.classification.InterfaceStability;
026    import org.apache.hadoop.io.Writable;
027    
028    /** Store the summary of a content (a directory or a file). */
029    @InterfaceAudience.Public
030    @InterfaceStability.Evolving
031    public class ContentSummary implements Writable{
032      private long length;
033      private long fileCount;
034      private long directoryCount;
035      private long quota;
036      private long spaceConsumed;
037      private long spaceQuota;
038      
039    
040      /** Constructor */
041      public ContentSummary() {}
042      
043      /** Constructor */
044      public ContentSummary(long length, long fileCount, long directoryCount) {
045        this(length, fileCount, directoryCount, -1L, length, -1L);
046      }
047    
048      /** Constructor */
049      public ContentSummary(
050          long length, long fileCount, long directoryCount, long quota,
051          long spaceConsumed, long spaceQuota) {
052        this.length = length;
053        this.fileCount = fileCount;
054        this.directoryCount = directoryCount;
055        this.quota = quota;
056        this.spaceConsumed = spaceConsumed;
057        this.spaceQuota = spaceQuota;
058      }
059    
060      /** @return the length */
061      public long getLength() {return length;}
062    
063      /** @return the directory count */
064      public long getDirectoryCount() {return directoryCount;}
065    
066      /** @return the file count */
067      public long getFileCount() {return fileCount;}
068      
069      /** Return the directory quota */
070      public long getQuota() {return quota;}
071      
072      /** Retuns (disk) space consumed */ 
073      public long getSpaceConsumed() {return spaceConsumed;}
074    
075      /** Returns (disk) space quota */
076      public long getSpaceQuota() {return spaceQuota;}
077      
078      @Override
079      @InterfaceAudience.Private
080      public void write(DataOutput out) throws IOException {
081        out.writeLong(length);
082        out.writeLong(fileCount);
083        out.writeLong(directoryCount);
084        out.writeLong(quota);
085        out.writeLong(spaceConsumed);
086        out.writeLong(spaceQuota);
087      }
088    
089      @Override
090      @InterfaceAudience.Private
091      public void readFields(DataInput in) throws IOException {
092        this.length = in.readLong();
093        this.fileCount = in.readLong();
094        this.directoryCount = in.readLong();
095        this.quota = in.readLong();
096        this.spaceConsumed = in.readLong();
097        this.spaceQuota = in.readLong();
098      }
099      
100      /** 
101       * Output format:
102       * <----12----> <----12----> <-------18------->
103       *    DIR_COUNT   FILE_COUNT       CONTENT_SIZE FILE_NAME    
104       */
105      private static final String STRING_FORMAT = "%12d %12d %18d ";
106      /** 
107       * Output format:
108       * <----12----> <----15----> <----15----> <----15----> <----12----> <----12----> <-------18------->
109       *    QUOTA   REMAINING_QUATA SPACE_QUOTA SPACE_QUOTA_REM DIR_COUNT   FILE_COUNT   CONTENT_SIZE     FILE_NAME    
110       */
111      private static final String QUOTA_STRING_FORMAT = "%12s %15s ";
112      private static final String SPACE_QUOTA_STRING_FORMAT = "%15s %15s ";
113      
114      /** The header string */
115      private static final String HEADER = String.format(
116          STRING_FORMAT.replace('d', 's'), "directories", "files", "bytes");
117    
118      private static final String QUOTA_HEADER = String.format(
119          QUOTA_STRING_FORMAT + SPACE_QUOTA_STRING_FORMAT, 
120          "quota", "remaining quota", "space quota", "reamaining quota") +
121          HEADER;
122      
123      /** Return the header of the output.
124       * if qOption is false, output directory count, file count, and content size;
125       * if qOption is true, output quota and remaining quota as well.
126       * 
127       * @param qOption a flag indicating if quota needs to be printed or not
128       * @return the header of the output
129       */
130      public static String getHeader(boolean qOption) {
131        return qOption ? QUOTA_HEADER : HEADER;
132      }
133      
134      @Override
135      public String toString() {
136        return toString(true);
137      }
138    
139      /** Return the string representation of the object in the output format.
140       * if qOption is false, output directory count, file count, and content size;
141       * if qOption is true, output quota and remaining quota as well.
142       * 
143       * @param qOption a flag indicating if quota needs to be printed or not
144       * @return the string representation of the object
145       */
146      public String toString(boolean qOption) {
147        String prefix = "";
148        if (qOption) {
149          String quotaStr = "none";
150          String quotaRem = "inf";
151          String spaceQuotaStr = "none";
152          String spaceQuotaRem = "inf";
153          
154          if (quota>0) {
155            quotaStr = Long.toString(quota);
156            quotaRem = Long.toString(quota-(directoryCount+fileCount));
157          }
158          if (spaceQuota>0) {
159            spaceQuotaStr = Long.toString(spaceQuota);
160            spaceQuotaRem = Long.toString(spaceQuota - spaceConsumed);        
161          }
162          
163          prefix = String.format(QUOTA_STRING_FORMAT + SPACE_QUOTA_STRING_FORMAT, 
164                                 quotaStr, quotaRem, spaceQuotaStr, spaceQuotaRem);
165        }
166        
167        return prefix + String.format(STRING_FORMAT, directoryCount, 
168                                      fileCount, length);
169      }
170    }