All Downloads are FREE. Search and download functionalities are using the official Maven repository.

xyz.cofe.fs.UnixPath Maven / Gradle / Ivy

The newest version!
/*
 * The MIT License
 *
 * Copyright 2014 Kamnev Georgiy ([email protected]).
 *
 * Данная лицензия разрешает, безвозмездно, лицам, получившим копию данного программного
 * обеспечения и сопутствующей документации (в дальнейшем именуемыми "Программное Обеспечение"),
 * использовать Программное Обеспечение без ограничений, включая неограниченное право на
 * использование, копирование, изменение, объединение, публикацию, распространение, сублицензирование
 * и/или продажу копий Программного Обеспечения, также как и лицам, которым предоставляется
 * данное Программное Обеспечение, при соблюдении следующих условий:
 *
 * Вышеупомянутый копирайт и данные условия должны быть включены во все копии
 * или значимые части данного Программного Обеспечения.
 *
 * ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ ЛЮБОГО ВИДА ГАРАНТИЙ,
 * ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ,
 * СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И НЕНАРУШЕНИЯ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ
 * ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ
 * ИЛИ ДРУГИХ ТРЕБОВАНИЙ ПО ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ, ИМЕЮЩИМ
 * ПРИЧИНОЙ ИЛИ СВЯЗАННЫМ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
 * ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
 */

package xyz.cofe.fs;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.logging.Level;
import java.util.logging.Logger;
//import xyz.cofe.common.Text;

/**
 * Путь в нотации UNIX. 
* * Примеры с пояснениями
* * /home/user - путь состоит из компонент, в данном случаи их две: home и user.
* Компоненты разделены между собой слешем (/).
* Этот путь является абсолютным, т.к. начинается с слеша.
* * @author Kamnev Georgiy ([email protected]) */ public class UnixPath implements Comparable { // private static void logFine(String message,Object ... args){ Logger.getLogger(UnixPath.class.getName()).log(Level.FINE, message, args); } private static void logFiner(String message,Object ... args){ Logger.getLogger(UnixPath.class.getName()).log(Level.FINER, message, args); } private static void logFinest(String message,Object ... args){ Logger.getLogger(UnixPath.class.getName()).log(Level.FINEST, message, args); } private static void logInfo(String message,Object ... args){ Logger.getLogger(UnixPath.class.getName()).log(Level.INFO, message, args); } private static void logWarning(String message,Object ... args){ Logger.getLogger(UnixPath.class.getName()).log(Level.WARNING, message, args); } private static void logSevere(String message,Object ... args){ Logger.getLogger(UnixPath.class.getName()).log(Level.SEVERE, message, args); } private static void logException(Throwable ex){ Logger.getLogger(UnixPath.class.getName()).log(Level.SEVERE, null, ex); } // // /** * Разделяет строку на подстроки, где в качестве разделитя указана строка. * * * * * * * * * * * * * * *
Исходная строкаРазделительРезультат
"delim""delim"""
"delimabc""delim"""
"abc"
"abcdelimabc""delim""abc"
"abc"
"abcdelim""delim""abc"
""
"abc""delim""abc"
"abc""""abc"
* * @param src Исходня строка * @param splitter Разделитель * @return Подстроки */ private static String[] split(String src, String splitter) { if (src == null) { throw new IllegalArgumentException("src == null"); } if (splitter == null) { throw new IllegalArgumentException("splitter == null"); } ArrayList result = new ArrayList(); if (splitter.equals(src)) { result.add(""); } else if (splitter.length() > src.length()) { result.add(src); } else { int offset = 0; while (true) { if (offset > src.length()) break; if (offset == src.length()) { result.add(""); break; } int next = src.indexOf(splitter, offset); if (next < 0) { String s = src.substring(offset, src.length()); result.add(s); break; } else { String s = src.substring(offset, next); result.add(s); offset = next + splitter.length(); } } } return result.toArray(new String[]{}); } private static Iterable splitIterable(String src,String splitter){ String[] arr = split(src,splitter); return xyz.cofe.collection.Iterators.array(arr); } //
// /** * Объединяет строки вставляя между ними заданную строку * * @param lines Строки * @param glue Вставка * @return Результат склейки */ private static String join(Iterable lines, String glue) { if (lines == null) { throw new IllegalArgumentException("lines == null"); } if (glue == null) { throw new IllegalArgumentException("glue == null"); } StringBuilder res = new StringBuilder(); int idx = -1; for( String line : lines ){ idx++; if( idx>0 )res.append(glue); if( line!=null )res.append(line); } return res.toString(); } /** * Объединяет строки вставляя между ними заданную строку * * @param lines Строки * @param glue Вставка * @param from С какой строки начать * @param count Сколько строк объединять * @return Результат склейки */ private static String join(String[] lines, String glue, int from, int count) { if (lines == null) { throw new IllegalArgumentException("lines == null"); } if (glue == null) { throw new IllegalArgumentException("glue == null"); } String res = ""; for (int i = 0; i < count; i++) { int idx = from + i; String line = (idx >= 0 && idx < lines.length) ? lines[idx] : ""; if (line == null) line = ""; if (i > 0) res += glue; res += line; } return res; } /** * Объединяет строки вставляя между ними заданную строку * * @param lines Строки * @param glue Вставка * @return Результат склейки */ private static String join(String[] lines, String glue) { if (lines == null) { throw new IllegalArgumentException("lines == null"); } if (glue == null) { throw new IllegalArgumentException("glue == null"); } return join(lines, glue, 0, lines.length); } // /** * Возвращает строку из указанной позиции заданной или меньше длинны * @param source исходный текст * @param beginIndex позиция, больше или равно 0, может быть больше длины строки * @param len длина искомого текста (может быть за пределами границ текста), больше или равен 0 * @return текст, если за границами вернет пустую строку */ private static String lookupText(String source,int beginIndex,int len){ if( source==null )throw new IllegalArgumentException( "source==null" ); if( len<0 )throw new IllegalArgumentException( "len<0" ); if( beginIndex<0 )throw new IllegalArgumentException( "beginIndex<0" ); if( beginIndex>=source.length() )return ""; if( (beginIndex+len)>source.length() ){ len = source.length() - beginIndex; } return source.substring(beginIndex, beginIndex+len); } private final static String filesep = "/"; //System.getProperty("file.separator", "/"); private final static String current = "."; private final static String parent = ".."; private final static String empty = ""; private String[] components = null; private final boolean useEscape = true; private final char escape = '\\'; /** * Конструктор * @param components компоненты пути */ protected UnixPath( String[] components ){ if( components==null )throw new IllegalArgumentException( "components==null" ); // if( components.length<1 )throw new IllegalArgumentException( "components.length<1" ); for( int i=0; i escapeRewrite, // String escapeAnyPrefix, // String filesep // ){ // ArrayList list = new ArrayList(); // StringBuilder buff = new StringBuilder(); // for( int i=0; i escapeEntry : escapeRewrite.entrySet() ){ // if( escapeEntry==null )continue; // String escapeChars = escapeEntry.getKey(); // String escapeRwrite = escapeEntry.getValue(); // if( escapeChars==null || escapeChars.length()==0 )continue; // String lt = lookupText(path, i, escapeChars.length()); // if( escapeChars.equals(lt) ){ // if( escapeRwrite!=null ){ // buff.append(escapeRwrite); // } // i += escapeChars.length()-1; // } // } // } // // if( escapeAnyPrefix!=null ){ // // } // //// String lt = Text.lookupText(path, i, 2); // String lt = lookupText(path, i, 2); // if( lt.length()==2 ){ // char c0 = lt.charAt(0); // char c1 = lt.charAt(1); // if( c0==escape ){ // buff.append(c1); // i+=1; // } else if( c0==filesep ){ // list.add(buff.toString()); // buff.setLength(0); // }else{ // buff.append(c0); // } // }else if( lt.length()==1 ){ // char c0 = lt.charAt(0); // if( c0==escape ){ // }else if( c0==filesep ){ // list.add(buff.toString()); // buff.setLength(0); // }else{ // buff.append(c0); // } // } // } // if( buff.length()>0 )list.add( buff.toString() ); // return list.toArray( new String[]{} ); // } private static String[] parse( String path, char escape, char filesep ){ ArrayList list = new ArrayList(); StringBuilder buff = new StringBuilder(); for( int i=0; i0 )list.add( buff.toString() ); return list.toArray( new String[]{} ); } /** * Конструктор копирования * @param src исходный образец */ public UnixPath( UnixPath src ){ if( src==null )throw new IllegalArgumentException( "src==null" ); this.components = src.components; } /** * Создает дочерний путь * @param base базовый путь * @param child дочернее имя или относительный путь */ public UnixPath( UnixPath base, String child ){ if( base==null )throw new IllegalArgumentException( "base==null" ); if( child==null )throw new IllegalArgumentException( "child==null" ); UnixPath childPath = new UnixPath(child); String[] cmpts = Arrays.copyOf(base.components, base.components.length + childPath.components.length); System.arraycopy(childPath.components, 0, cmpts, base.components.length, childPath.components.length); this.components = cmpts; } /** * Возвращает компонеты пути * @return компоненты пути */ public String[] getComponents(){ return components; } /** * Возвращает компоненты пути с указанного индекса * @param beginIndex индекс компоненты * @return Компоненты пути */ public String[] getComponents(int beginIndex){ if( beginIndex<=0 )return components; if( beginIndex>=components.length )return new String[]{}; return Arrays.copyOfRange(components, beginIndex, components.length); } private String encodeComponent( String component ){ StringBuilder sb = new StringBuilder(); char file_sep = filesep.charAt(0); for( int i=0; i0 )path.append(sep); path.append(encodeComponent(cmpt)); } return path.toString(); }else{ if( components.length==1 && components[0]!=null && components[0].equals("") )return filesep; // return Text.join(components, filesep); return join(components, filesep); } } /** * Возвращает признак что путь является абсолютным * @return true - абсолютный путь */ public boolean isAbsolute(){ return components.length>0 && components[0]!=null && components[0].length()==0; } private boolean getAbsolute_allowRetNull(){ return false; } /** * Возвращает абсолютный путь относительно текущего каталога * @param currentDir текущий каталог * @return абсолютный путь */ public UnixPath getAbsolute( UnixPath currentDir ){ if( this.isAbsolute() )return this; if( currentDir==null )throw new IllegalArgumentException( "currentDir==null" ); if( !currentDir.isAbsolute() )throw new IllegalArgumentException( "!currentDir.isAbsolute()" ); // ArrayList cmpts = new ArrayList(); // cmpts.addAll(Arrays.asList(currentDir.getComponents())); // for( String cmpt : components ){ // if( cmpt.equals(empty) )continue; // if( cmpt.equals(current) )continue; // if( cmpt.equals(parent) ){ // if( cmpts.size()>1 ){ // cmpts.remove(cmpts.size()-1); // continue; // }else{ // if( getAbsolute_allowRetNull() ){ // return null; // }else{ // continue; // } // } // } // cmpts.add(cmpt); // } // return new UnixPath(cmpts.toArray(new String[]{})); ArrayList cmpts = new ArrayList(); for( String c : currentDir.getComponents() ){ cmpts.add(c); } for( String c : this.getComponents() ){ cmpts.add(c); } return new UnixPath(cmpts.toArray(new String[]{})); } // public boolean isCanonical(){ // if( components.length>0 ){ // if( components[0]==null )return false; // if( components[0].equals(current) )return false; // if( components[0].equals(parent) )return false; // } // for( int i=1; i cmpts = new ArrayList(); // if( components.length>0 ){ // if( components[0].equals(current) ){ // //skip // }else if( components[0].equals(parent) ){ // return null; // }else if( components[ // } // return new UnixPath(cmpts.toArray(new String[]{})); // } private boolean resolveLink_allowRetNull(){ return false; } /** * "Разрешает" ссылку.
* Примеры:
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
current dirthislinkresult
/opt/jdk/default/opt/jdk/defaultjdk1.8.0_05/opt/jdk/jdk1.8.0_05
/opt/jdk/default/opt/jdk/default./jdk1.8.0_05/opt/jdk/jdk1.8.0_05
/opt/jdk/default/opt/jdk/default../jdk1.8.0_05/opt/jdk1.8.0_05
/opt/jdk/default/opt/jdk/default../../jdk1.8.0_05/jdk1.8.0_05
/opt/jdk/default/opt/jdk/default../../../../jdk1.8.0_05/jdk1.8.0_05
* @param link куда указывает ссылка * @param currentDir текущий каталог * @return цель */ public UnixPath resolveLink( UnixPath link, UnixPath currentDir ){ if( currentDir==null )throw new IllegalArgumentException( "currentDir==null" ); if( link==null )throw new IllegalArgumentException( "path==null" ); if( link.isAbsolute() )return link; UnixPath p = !isAbsolute() ? getAbsolute(currentDir) : this; ArrayList cmpts = new ArrayList(); cmpts.addAll(Arrays.asList(p.getComponents())); if( cmpts.size()>0 )cmpts.remove(cmpts.size()-1); for( String cmpt : link.getComponents() ){ if( cmpt.equals(current) )continue; if( cmpt.equals(empty) )continue; if( cmpt.equals(parent) ){ if( cmpts.size()>1 ){ cmpts.remove(cmpts.size()-1); continue; }else{ if( resolveLink_allowRetNull() ){ return null; }else{ continue; } } } cmpts.add(cmpt); } return new UnixPath(cmpts.toArray(new String[]{})); } /** * Приведение к каноничному виду, без лишних и пустых компонент пути * @return каноничная форма */ public UnixPath getCanonical(){ if( components!=null && components.length==1 && components[0]!=null && components[0].equals(current) ){ return this; } if( components!=null && components.length==1 && components[0]!=null && components[0].length()==0 ){ return this; } ArrayList cmpts = new ArrayList(); cmpts.addAll(Arrays.asList(UnixPath.this.getComponents())); cmpts = removeCurrent(cmpts); removeEmpties(cmpts); removeParent(cmpts); // removeTrailEmpties(cmpts); return new UnixPath(cmpts.toArray(new String[]{})); } private void removeTrailEmpties( ArrayList components ){ ArrayList cmpts = new ArrayList(); int begin = -1; int endExc = -1; for( int i=components.size()-1; i>=0; i++ ){ String cmpt0 = components.get(i); if( cmpt0.equals(empty) ){ if( endExc<0 ){ begin = i; endExc = i+1; }else{ begin = i; } }else{ break; } } if( begin>0 && endExc>0 && endExc>begin ){ for( int i=0; i components ){ boolean abs = components.size()>0 && components.get(0).length()==0; int begin = -1; int endExc = -1; int state = 0; while( state!=99 ){ switch( state ){ case 0: // find parent begin = -1; for( int i=abs ? 1 : 0; i components ){ boolean abs = components.size()>0 && components.get(0).length()==0; int del = -1; int state = 0; while( state!=99 ){ switch( state ){ case 0: del = -1; for( int i=abs ? 1 : 0; i=0 ){ state = 1; }else{ state = 99; } break; case 1: components.remove(del); state = 0; break; default: state = 99; break; } } } private void removeDiplicateEmpties( ArrayList components ){ boolean abs = components.size()>0 && components.get(0).length()==0; int begin = -1; int endExc = -1; int state = 0; while( state!=99 ){ switch( state ){ case 0: // find begin dupl begin = -1; for( int i=abs ? 1 : 0; i removeCurrent( ArrayList components ){ ArrayList cmpts = new ArrayList(); for( String cmpt : components ){ if( cmpt.equals(current) )continue; cmpts.add(cmpt); } return cmpts; } @Override public int compareTo(UnixPath o) { String p1 = toString(); String p2 = o.toString(); return p1.compareTo(p2); } public String getName(){ if( components.length==0 )return ""; if( components.length==1 )return components[0]; UnixPath canon = getCanonical(); if( canon!=null ){ String[] cmpts = canon.getComponents(); if( cmpts!=null && cmpts.length>0 )return cmpts[cmpts.length-1]; } return components[components.length-1]; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy