package railo.commons.io;
import java.io.IOException;
public final class ModeUtil {
public static final int PERM_READ = 04;
public static final int PERM_WRITE = 02;
public static final int PERM_EXECUTE = 01;
public static final int ROLE_OWNER = 0100;
public static final int ROLE_GROUP = 010;
public static final int ROLE_WORLD = 01;
/**
* translate a string mode (777 or drwxrwxrwx to a octal value)
* @param strMode
* @return
*/
public static int toOctalMode(String strMode) throws IOException {
strMode=strMode.trim().toLowerCase();
if(strMode.length()==9 || strMode.length()==10)
return _toOctalMode(strMode);
if(strMode.length()<=4 && strMode.length()>0)
return Integer.parseInt(strMode,8);
throw new IOException("can't translate ["+strMode+"] to a mode value");
}
private static int _toOctalMode(String strMode) {
int index;
strMode=strMode.trim().toLowerCase();
if(strMode.length()==9)index=0;
else index=1;
int mode=0;
// owner
if("r".equals(strMode.substring(index++,index)))mode+=0400;
if("w".equals(strMode.substring(index++,index)))mode+=0200;
if("x".equals(strMode.substring(index++,index)))mode+=0100;
// group
if("r".equals(strMode.substring(index++,index)))mode+=040;
if("w".equals(strMode.substring(index++,index)))mode+=020;
if("x".equals(strMode.substring(index++,index)))mode+=010;
// world
if("r".equals(strMode.substring(index++,index)))mode+=04;
if("w".equals(strMode.substring(index++,index)))mode+=02;
if("x".equals(strMode.substring(index++,index)))mode+=01;
return mode;
}
/**
* translate a octal mode value (73) to a string representation ("111")
* @param strMode
* @return
*/
public static String toStringMode(int octalMode) {
String str = Integer.toString(octalMode,8);
while(str.length()<3)str="0"+str;
return str;
}
/**
* update a string mode with a other (111+222=333 or 333+111=333 or 113+202=313)
* @param existing
* @param update
* @return
* @throws IOException
*/
public static String updateMode(String existing, String update) throws IOException {
return toStringMode(updateMode(toOctalMode(existing), toOctalMode(update)));
}
/**
* update octal mode with a other
* @param existingOctal
* @param updateOctal
* @return
*/
public static int updateMode(int existingOctal, int updateOctal) {
int tmp=existingOctal&updateOctal;
return (existingOctal-tmp)+updateOctal;
}
/**
* check mode for a specific permission
* @param role
* @param permission
* @param mode
* @return
*/
public static boolean hasPermission(int role, int permission, int mode) {
return (mode&(role*permission))>0;
}
/** check if mode is readable for owner
* @param octalMode
* @return
*/
public static boolean isReadable(int octalMode) {
return hasPermission(ROLE_OWNER,PERM_READ, octalMode);
}
/** check if mode is writeable for owner
* @param octalMode
* @return
*/
public static boolean isWritable(int octalMode) {
return hasPermission(ROLE_OWNER,PERM_WRITE, octalMode);
}
/** check if mode is executable for owner
* @param octalMode
* @return
*/
public static boolean isExecutable(int octalMode) {
return hasPermission(ROLE_OWNER,PERM_EXECUTE, octalMode);
}
public static int setReadable(int octalMode, boolean value) {
int tmp=octalMode&0444;
if(value)return (octalMode-tmp)+0444;
return octalMode-tmp;
}
public static int setWritable(int octalMode, boolean value) {
int tmp=octalMode&0222;
if(value)return (octalMode-tmp)+0222;
return octalMode-tmp;
}
public static int setExecutable(int octalMode, boolean value) {
int tmp=octalMode&0111;
if(value)return (octalMode-tmp)+0111;
return octalMode-tmp;
}
public static void main(String[] args) throws IOException {
System.out.println(toStringMode(toOctalMode("--xrwxrwx")));
System.out.println(toStringMode(Integer.parseInt("0777",8)));
}
}