Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * ====================================================================
   * Copyright (c) 2004-2006 TMate Software Ltd.  All rights reserved.
   *
   * This software is licensed as described in the file COPYING, which
   * you should have received as part of this distribution.  The terms
   * are also available at http://svnkit.com/license.html
   * If newer versions of this license are posted there, you may use a
   * newer version instead, at your option.
  * ====================================================================
  */
 package org.tmatesoft.svn.core.internal.wc;
 
 import java.io.File;
 import java.util.Map;
 

Author(s):
TMate Software Ltd.
Version:
1.1.0
 
 public class SVNPropertiesManager {
     
     private static final Collection NOT_ALLOWED_FOR_FILE = new HashSet();
     private static final Collection NOT_ALLOWED_FOR_DIR = new HashSet();
     
     static {
         
     }
 
     public static void setWCProperty(SVNWCAccess accessFile pathString propNameString propValueboolean writethrows SVNException {
         SVNEntry entry = access.getEntry(pathfalse);
         if (entry == null) {
             SVNErrorMessage err = SVNErrorMessage.create(."''{0}'' is not under version control"path);
             SVNErrorManager.error(err);
         }
         SVNAdminArea dir = entry.getKind() == . ? access.retrieve(path) : access.retrieve(path.getParentFile());
         dir.getWCProperties(entry.getName()).setPropertyValue(propNamepropValue);
         if (write) {
             dir.saveWCProperties(false);
         }
     }
 
     public static String getWCProperty(SVNWCAccess accessFile pathString propNamethrows SVNException {
         SVNEntry entry = access.getEntry(pathfalse);
         if (entry == null) {
             return null;
         }
         SVNAdminArea dir = entry.getKind() == . ? access.retrieve(path) : access.retrieve(path.getParentFile());
         return dir.getWCProperties(entry.getName()).getPropertyValue(propName);
     }
     
     public static void deleteWCProperties(SVNAdminArea dirString nameboolean recursivethrows SVNException {
         if (name != null) {
             SVNVersionedProperties props = dir.getWCProperties(name);
             if (props != null) {
                 props.removeAll();
             }
         } 
         if (recursive || name == null) {
             for(Iterator entries = dir.entries(false); entries.hasNext();) {
                 SVNEntry entry = (SVNEntryentries.next();
                 if (name != null) {
                     SVNVersionedProperties props = dir.getWCProperties(entry.getName());
                     if (props != null) {
                         props.removeAll();
                     }
                 }
                 if (dir.getThisDirName().equals(entry.getName())) {
                     continue;
                 }
                 if (entry.isFile()) {
                     continue;                    
                }
                if (recursive) {
                    SVNAdminArea childDir = dir.getWCAccess().retrieve(dir.getFile(entry.getName()));
                    deleteWCProperties(childDirnulltrue);
                }
            }
        }
        dir.saveWCProperties(false);
    }
    public static String getProperty(SVNWCAccess accessFile pathString propNamethrows SVNException {
        SVNEntry entry = access.getEntry(pathfalse);
        if (entry == null) {
            return null;
        }
        String[] cachableProperties = entry.getCachableProperties();
        if (cachableProperties != null && contains(cachablePropertiespropName)) {
            String[] presentProperties = entry.getPresentProperties();
            if (presentProperties == null || !contains(presentPropertiespropName)) {
                return null;
            }
            if (SVNProperty.isBooleanProperty(propName)) {
                return SVNProperty.getValueOfBooleanProperty(propName);
            }
        }
        if (SVNProperty.isWorkingCopyProperty(propName)) {
            return getWCProperty(accesspathpropName);
        } else if (SVNProperty.isEntryProperty(propName)) {
            SVNErrorMessage err = SVNErrorMessage.create(."Property ''{0}'' is an entry property"propName);
            SVNErrorManager.error(err);
        } 
        SVNAdminArea dir = entry.getKind() == . ? access.retrieve(path) : access.retrieve(path.getParentFile());
        return dir.getProperties(entry.getName()).getPropertyValue(propName);
    }
    public static void setProperty(SVNWCAccess accessFile pathString propNameString propValueboolean skipChecksthrows SVNException {
        if (SVNProperty.isWorkingCopyProperty(propName)) {
            setWCProperty(accesspathpropNamepropValuetrue);
            return;
        } else if (SVNProperty.isEntryProperty(propName)) {
            SVNErrorMessage err = SVNErrorMessage.create(."Property ''{0}'' is an entry property"propName);
            SVNErrorManager.error(err);
        }
        SVNEntry entry = access.getEntry(pathfalse);
        if (entry == null) {
            SVNErrorMessage err = SVNErrorMessage.create(."''{0}'' is not under version control"path);
            SVNErrorManager.error(err);
        }
        SVNAdminArea dir = entry.getKind() == . ? access.retrieve(path) : access.retrieve(path.getParentFile());
        boolean updateTimeStamp = ..equals(propName);
        if (propValue != null) {
            validatePropertyName(pathpropNameentry.getKind());
            if (!skipChecks && ..equals(propName)) {
                propValue = propValue.trim();
                validateEOLProperty(pathaccess);
            } else if (!skipChecks && ..equals(propName)) {
                propValue = propValue.trim();
                validateMimeType(propValue);
            } else if (..equals(propName) || ..equals(propName)) {
                if (!propValue.endsWith("\n")) {
                    propValue += "\n";
                }
                if (..equals(propName)) {
                    // TODO validate
                }
            } else if (..equals(propName)) {
                propValue = propValue.trim();
            }
        }
        if (entry.getKind() == . && ..equals(propName)) {
            if (propValue == null) {
                SVNFileUtil.setExecutable(pathfalse);
            } else {
                propValue = SVNProperty.getValueOfBooleanProperty(propName);
                SVNFileUtil.setExecutable(pathtrue);
            }
        }
        if (entry.getKind() == . && ..equals(propName)) {
            if (propValue == null) {
                SVNFileUtil.setReadonly(pathfalse);
            } else {
                propValue = SVNProperty.getValueOfBooleanProperty(propName);
            }
        }
        SVNVersionedProperties properties = dir.getProperties(entry.getName());
        if (!updateTimeStamp && (entry.getKind() == . && ..equals(propName))) {
            String oldValue = properties.getPropertyValue(.);
            Collection oldKeywords = getKeywords(oldValue);
            Collection newKeywords = getKeywords(propValue);
            updateTimeStamp = !oldKeywords.equals(newKeywords); 
        }
        SVNLog log = dir.getLog();
        if (updateTimeStamp) {
            Map command = new HashMap();
            command.put(.entry.getName());
            command.put(SVNProperty.shortPropertyName(.), null);
            log.addCommand(.commandfalse);
        }
        properties.setPropertyValue(propNamepropValue);
        dir.saveVersionedProperties(logfalse);
        log.save();
        dir.runLogs();
    }
    
    public static SVNStatusType mergeProperties(SVNWCAccess wcAccessFile pathMap basePropertiesMap diffboolean baseMergeboolean dryRunthrows SVNException {
        SVNEntry entry = wcAccess.getEntry(pathfalse);
        if (entry == null) {
            SVNErrorMessage err = SVNErrorMessage.create(."''{0}'' is not under version control"path);
            SVNErrorManager.error(err);
        }
        File parent = null;
        String name = null;
        if (entry.isDirectory()) {
            parent = path;
            name = "";
        } else if (entry.isFile()) {
            parent = path.getParentFile();
            name = entry.getName();
        } 
        
        SVNLog log = null;
        SVNAdminArea dir = wcAccess.retrieve(parent);
        if (!dryRun) {
            log = dir.getLog();            
        }
        SVNStatusType result = dir.mergeProperties(namebasePropertiesdiffbaseMergedryRunlog);
        if (!dryRun) {
            log.save();
            dir.runLogs();
        }
        return result
    }
    
    public static Map computeAutoProperties(ISVNOptions optionsFile file) {
        Map properties = options.applyAutoProperties(filenull);
        if (!properties.containsKey(.)) {
            String mimeType = SVNFileUtil.detectMimeType(file);
            if (mimeType != null) {
                properties.put(.mimeType);
            }
        }
        if (SVNProperty.isBinaryMimeType((Stringproperties.get(.))) {
            properties.remove(.);
        }
        if (!properties.containsKey(.)) { 
            if (SVNFileUtil.isExecutable(file)) {
                properties.put(., SVNProperty.getValueOfBooleanProperty(.));
            }
        }
        return properties;
    }
    
    private static void validatePropertyName(File pathString nameSVNNodeKind kindthrows SVNException {
        SVNErrorMessage err = null;
        if (kind == .) {
            if (.contains(name)) {
                err = SVNErrorMessage.create(."Cannot set ''{0}'' on a directory (''{1}'')"new Object[] {namepath});
            }
        } else if (kind == .) {
            if (.contains(name)) {
                err = SVNErrorMessage.create(."Cannot set ''{0}'' on a file (''{1}'')"new Object[] {namepath});
            }
        } else {
            err = SVNErrorMessage.create(."''{0}'' is not a file or directory"path);
        }
        if (err != null) {
            SVNErrorManager.error(err);
        }
    }
    private static void validateEOLProperty(File pathSVNWCAccess accessthrows SVNException {
        String mimeType = getProperty(accesspath.);
        if (mimeType != null && SVNProperty.isBinaryMimeType(mimeType)) {
            SVNErrorMessage err = SVNErrorMessage.create(."File ''{0}'' has binary mime type property"path);
            SVNErrorManager.error(err);
        }
        boolean consistent = SVNTranslator.checkNewLines(path);
        if (!consistent) {
            SVNErrorMessage err = SVNErrorMessage.create(."File ''{0}'' has inconsistent newlines"path);
            SVNErrorManager.error(err);
        }
    }
    private static void validateMimeType(String valuethrows SVNException {
        String type = value.indexOf(';') >= 0 ? value.substring(0, value.indexOf(';')) : value;
        SVNErrorMessage err = null;
        if (type.length() == 0) {
            err = SVNErrorMessage.create(."MIME type ''{0}'' has empty media type"value);
        } else if (type.indexOf('/') < 0) {
            err = SVNErrorMessage.create(."MIME type ''{0}'' does not contain ''/''"value);
        } else if (!Character.isLetterOrDigit(type.charAt(type.length() - 1))) {
            err = SVNErrorMessage.create(."MIME type ''{0}'' ends with non-alphanumeric character"value);
        }
        if (err != null) {
            SVNErrorManager.error(err);
        }
    }
    
    private static Collection getKeywords(String value) {
        Collection keywords = new HashSet();
        if (value == null || "".equals(value.trim())) {
            return keywords;
        }
        for(StringTokenizer tokens = new StringTokenizer(value" \t\n\r"); tokens.hasMoreTokens();) {
            keywords.add(tokens.nextToken().toLowerCase());
        }
        return keywords;
    }
    
    private static boolean contains(String[] valuesString value) {
        for (int i = 0; value != null && i < values.lengthi++) {
            if (values[i].equals(value)) {
                return true;
            }
        }
        return false;
    }
New to GrepCode? Check out our FAQ X