blob: a6ed2c265ef5aaa11d3524d031d4a4d23d246faa [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.nifi.processor.util.file.transfer;
import java.io.File;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.nifi.processor.util.list.ListableEntity;
import org.apache.nifi.serialization.SimpleRecordSchema;
import org.apache.nifi.serialization.record.MapRecord;
import org.apache.nifi.serialization.record.Record;
import org.apache.nifi.serialization.record.RecordField;
import org.apache.nifi.serialization.record.RecordFieldType;
import org.apache.nifi.serialization.record.RecordSchema;
public class FileInfo implements Comparable<FileInfo>, Serializable, ListableEntity {
private static final long serialVersionUID = 1L;
private static final RecordSchema SCHEMA;
private static final String FILENAME = "filename";
private static final String PATH = "path";
private static final String DIRECTORY = "directory";
private static final String SIZE = "size";
private static final String LAST_MODIFIED = "lastModified";
private static final String PERMISSIONS = "permissions";
private static final String OWNER = "owner";
private static final String GROUP = "group";
private static final char[] PERMISSION_MODIFIER_CHARS = "xwrxwrxwr".toCharArray();
static {
final List<RecordField> recordFields = new ArrayList<>();
recordFields.add(new RecordField(FILENAME, RecordFieldType.STRING.getDataType(), false));
recordFields.add(new RecordField(PATH, RecordFieldType.STRING.getDataType(), false));
recordFields.add(new RecordField(DIRECTORY, RecordFieldType.BOOLEAN.getDataType(), false));
recordFields.add(new RecordField(SIZE, RecordFieldType.LONG.getDataType(), false));
recordFields.add(new RecordField(LAST_MODIFIED, RecordFieldType.TIMESTAMP.getDataType(), false));
recordFields.add(new RecordField(PERMISSIONS, RecordFieldType.STRING.getDataType()));
recordFields.add(new RecordField(OWNER, RecordFieldType.STRING.getDataType()));
recordFields.add(new RecordField(GROUP, RecordFieldType.STRING.getDataType()));
SCHEMA = new SimpleRecordSchema(recordFields);
}
private final boolean directory;
private final long size;
private final long lastModifiedTime;
private final String fileName;
private final String fullPathFileName;
private final String permissions;
private final String owner;
private final String group;
public String getFileName() {
return fileName;
}
public String getFullPathFileName() {
return fullPathFileName;
}
public boolean isDirectory() {
return directory;
}
public long getSize() {
return size;
}
public long getLastModifiedTime() {
return lastModifiedTime;
}
public String getPermissions() {
return permissions;
}
public String getOwner() {
return owner;
}
public String getGroup() {
return group;
}
public Record toRecord() {
final Map<String, Object> values = new HashMap<>(8);
values.put(FILENAME, getFileName());
values.put(PATH, new File(getFullPathFileName()).getParent());
values.put(DIRECTORY, isDirectory());
values.put(SIZE, getSize());
values.put(LAST_MODIFIED, getLastModifiedTime());
values.put(PERMISSIONS, getPermissions());
values.put(OWNER, getOwner());
values.put(GROUP, getGroup());
return new MapRecord(SCHEMA, values);
}
public static RecordSchema getRecordSchema() {
return SCHEMA;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((fullPathFileName == null) ? 0 : fullPathFileName.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
FileInfo other = (FileInfo) obj;
if (fullPathFileName == null) {
if (other.fullPathFileName != null) {
return false;
}
} else if (!fullPathFileName.equals(other.fullPathFileName)) {
return false;
}
return true;
}
@Override
public int compareTo(FileInfo o) {
return fullPathFileName.compareTo(o.fullPathFileName);
}
protected FileInfo(final Builder builder) {
this.directory = builder.directory;
this.size = builder.size;
this.lastModifiedTime = builder.lastModifiedTime;
this.fileName = builder.fileName;
this.fullPathFileName = builder.fullPathFileName;
this.permissions = builder.permissions;
this.owner = builder.owner;
this.group = builder.group;
}
public static final class Builder {
private boolean directory;
private long size;
private long lastModifiedTime;
private String fileName;
private String fullPathFileName;
private String permissions;
private String owner;
private String group;
public FileInfo build() {
return new FileInfo(this);
}
public Builder directory(boolean directory) {
this.directory = directory;
return this;
}
public Builder size(long size) {
this.size = size;
return this;
}
public Builder lastModifiedTime(long lastModifiedTime) {
this.lastModifiedTime = lastModifiedTime;
return this;
}
public Builder filename(String fileName) {
this.fileName = fileName;
return this;
}
public Builder fullPathFileName(String pathFileName) {
this.fullPathFileName = pathFileName;
return this;
}
public Builder permissions(String permissions) {
this.permissions = permissions;
return this;
}
public Builder owner(String owner) {
this.owner = owner;
return this;
}
public Builder group(String group) {
this.group = group;
return this;
}
}
public static String permissionToString(int fileModeOctal) {
StringBuilder sb = new StringBuilder();
for (char p : PERMISSION_MODIFIER_CHARS) {
sb.append((fileModeOctal & 1) == 1 ? p : '-');
fileModeOctal >>= 1;
}
return sb.reverse().toString();
}
@Override
public String getName() {
return getFileName();
}
@Override
public String getIdentifier() {
final String fullPathName = getFullPathFileName();
return fullPathName == null ? getName() : fullPathName;
}
@Override
public long getTimestamp() {
return getLastModifiedTime();
}
}