alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

/*
 *                 Sun Public License Notice
 *
 * The contents of this file are subject to the Sun Public License
 * Version 1.0 (the "License"). You may not use this file except in
 * compliance with the License. A copy of the License is available at
 * http://www.sun.com/
 *
 * The Original Code is NetBeans. The Initial Developer of the Original
 * Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
 * Microsystems, Inc. All Rights Reserved.
 */

package org.netbeans.modules.javacvs.caching;
import java.io.*;
import java.util.*;
import java.beans.*;
import java.text.*;

import org.netbeans.lib.cvsclient.file.FileStatus;
import org.netbeans.modules.vcscore.cache.*;
import org.netbeans.modules.javacvs.commands.JavaCvsStatusManager;

/** File.
 *
 * @author Milos Kleint
 */
//-------------------------------------------
public class CvsCacheFile extends CacheFile {
    
    
    //-------------------------------------------
    public CvsCacheFile(String memberOfCache){
        super(memberOfCache, new CvsCacheFile.CvsPersistentData(false));
        setStatusNonModifying(JavaCvsStatusManager.LOCAL);
    }
    
    //-------------------------------------------
    public CvsCacheFile(String memberOfCache, String name){
        super(memberOfCache, name, new CvsCacheFile.CvsPersistentData(false));
        setStatusNonModifying(JavaCvsStatusManager.LOCAL);
    }
    
    CvsCacheFile(String memberOfCache, CacheFile.PersistentData data) {
        super(memberOfCache, data);
    }
    
    public void setLocal (boolean local) {
        ((CvsCacheFile.CvsPersistentData) getPersistentData()).setLocal(local);
    }

    public boolean isLocal () {
        return ((CvsCacheFile.CvsPersistentData) getPersistentData()).isLocal();
    }
    
    public static final CacheFile readFileCache(String line, String cacheName, java.io.File parent) {
        // need to know because the refreshing cache should not modify states and should add the file eveytime..
        boolean isJavaCvsCache = cacheName.equals(JavaCvsCache.JAVA_CACHE_NAME);
        
        StringTokenizer token = new StringTokenizer(line,"/", false); // NOI18N
        boolean newBehaviour = false;
        if (token.countTokens() >= 9) {
            newBehaviour = true;
            // NEW BEHAVIOUR.. NEW NUMBER OF TOKENS...
        }
        if (!line.startsWith("/")) { // NOI18N
            System.out.println("ERROR : Bad cache disk format (CvsCacheFile)"); // NOI18N
            return null;
        }
        if (token.countTokens() < 2) return null;
        String name = token.nextToken();
        CvsCacheFile newFile = new CvsCacheFile(cacheName, name);
        String status = token.nextToken().intern();
        boolean isNew = false;
        if (!new File(parent, name).exists()) { // not found == it's not on the local disk -> it's a shadow file
            isNew = true;
            // status AI - for all but removed and local change status to  NEEDS_CHECKOUT.
            // only to those that are in the JAVACVS cache.. thus the rela ones..
            // those that are created in the CacheUpdatingCommand don't count..
            if (isJavaCvsCache) {
                if (cacheName.equals(JavaCvsCache.JAVA_CACHE_NAME)) {
                    if (status.equals(JavaCvsStatusManager.LOCALLY_REMOVED)
                    || status.equals(JavaCvsStatusManager.LOCAL)
                    || status.equals(JavaCvsStatusManager.UNKNOWN)) {
                        newFile.setStatusNonModifying(status);
                    } else {
                        newFile.setStatusNonModifying(JavaCvsStatusManager.NEEDS_CHECKOUT);
                    }
                } else {
                    newFile.setStatusNonModifying(status);
                }
            } else {
                newFile.setStatusNonModifying(status);
            }
            
        } else {
            newFile.setStatusNonModifying(status);
        }
        if (newBehaviour) {
            String tokenStr = token.nextToken();
            newFile.setLocker(tokenStr.equals(" ") ? null : tokenStr.intern()); // NOI18N
            tokenStr = token.nextToken();
            newFile.setRevision(tokenStr.equals(" ") ? null : tokenStr.intern()); // NOI18N
            tokenStr = token.nextToken();
            newFile.setSticky(tokenStr.equals(" ") ? null : tokenStr.intern()); // NOI18N
            tokenStr = token.nextToken();
            newFile.setAttr(tokenStr.equals(" ") ? null : new String(tokenStr)); // NOI18N
            tokenStr = token.nextToken();
            int size = 0;
            try {
                size = Integer.parseInt(tokenStr);
            } catch (NumberFormatException exc) {
                size = 0;
            }
            newFile.setSize(size);
            tokenStr = token.nextToken();
            newFile.setDate(tokenStr.equals(" ") ? null : new String(tokenStr)); // NOI18N
            tokenStr = token.nextToken();
            newFile.setTime(tokenStr.equals(" ") ? null : new String(tokenStr)); // NOI18N
        } else {
            //OLD BEHAVIOUR...
            if (token.hasMoreTokens()) {
                String tokenStr = token.nextToken();
                newFile.setRevision(tokenStr.equals("") ? null : tokenStr.intern()); // NOI18N
            }
        }
        return newFile;
    }
    
    public static final CacheFile readFileCache(java.lang.String line, CvsCacheDir par) {
        // need to know because the refreshing cache should not modify states and should add the file eveytime..
        boolean isJavaCvsCache = par.getCacheName().equals(JavaCvsCache.JAVA_CACHE_NAME);
        
        StringTokenizer token = new StringTokenizer(line,"/", false); // NOI18N
        boolean newBehaviour = false;
        if (token.countTokens() >= 9) {
            newBehaviour = true;
            // NEW BEHAVIOUR.. NEW NUMBER OF TOKENS...
        }
        if (line.startsWith("D")) { // NOI18N
            String name = token.nextToken();
            name = token.nextToken();
            CvsCacheDir newFile = (CvsCacheDir)par.getSubDir(name);
            if (newFile == null) { // not found == it's not on the local disk -> it's a shadow file
                //                par.setStatus(JavaCvsStatusManager.NOT_IN_SYNCH);
                return newFile;
            }
            if (!token.hasMoreTokens()) return newFile;
            String stat = token.nextToken();
            newFile.setStatus(stat.intern());
            if (newBehaviour) {
                String tokenStr = token.nextToken();
                newFile.setLocker(tokenStr.equals(" ") ? null : tokenStr.intern()); // NOI18N
                tokenStr = token.nextToken();
                newFile.setRevision(tokenStr.equals(" ") ? null : tokenStr.intern()); // NOI18N
                tokenStr = token.nextToken();
                newFile.setSticky(tokenStr.equals(" ") ? null : tokenStr.intern()); // NOI18N
                tokenStr = token.nextToken();
                newFile.setAttr(tokenStr.equals(" ") ? null : new String(tokenStr)); // NOI18N
                tokenStr = token.nextToken();
                int size = 0;
                try {
                    size = Integer.parseInt(tokenStr);
                } catch (NumberFormatException exc) {
                    size = 0;
                }
                newFile.setSize(size);
                if (token.hasMoreTokens()) {
                    tokenStr = token.nextToken();
                    newFile.setDate(tokenStr.equals(" ") ? null : new String(tokenStr)); // NOI18N
                }
                if (token.hasMoreTokens()) {
                    tokenStr = token.nextToken();
                    newFile.setTime(tokenStr.equals(" ") ? null : new String(tokenStr)); // NOI18N
                }
                
            }
            return newFile;
        }
        if (!line.startsWith("/")) { // NOI18N
            System.out.println("ERROR : Bad cache disk format (CvsCacheFile)"); // NOI18N
            return null;
        }
        if (token.countTokens() < 2) return null;
        String name = token.nextToken();
        CvsCacheFile newFile = (CvsCacheFile)par.getFile(name);
        String status = token.nextToken().intern();
        boolean isNew = false;
        if (newFile == null) { // not found == it's not on the local disk -> it's a shadow file
            CvsCacheFile file = new CvsCacheFile(par.getCacheName(), name);
            isNew = true;
            newFile = file;
            // status AI - for all but removed and local change status to  NEEDS_CHECKOUT.
            // only to those that are in the JAVACVS cache.. thus the rela ones..
            // those that are created in the CacheUpdatingCommand don't count..
            if (isJavaCvsCache) {
                if (par.getCacheName().equals(JavaCvsCache.JAVA_CACHE_NAME)) {
                    if (status.equals(JavaCvsStatusManager.LOCALLY_REMOVED)
                    || status.equals(JavaCvsStatusManager.LOCAL)
                    || status.equals(JavaCvsStatusManager.UNKNOWN)) {
                        newFile.setStatusNonModifying(status);
                    } else {
                        newFile.setStatusNonModifying(JavaCvsStatusManager.NEEDS_CHECKOUT);
                    }
                } else {
                    newFile.setStatusNonModifying(status);
                }
            } else {
                newFile.setStatusNonModifying(status);
            }
            
        } else {
            newFile.setStatusNonModifying(status);
        }
        if (newBehaviour) {
            String tokenStr = token.nextToken();
            newFile.setLocker(tokenStr.equals(" ") ? null : tokenStr.intern()); // NOI18N
            tokenStr = token.nextToken();
            newFile.setRevision(tokenStr.equals(" ") ? null : tokenStr.intern()); // NOI18N
            tokenStr = token.nextToken();
            newFile.setSticky(tokenStr.equals(" ") ? null : tokenStr.intern()); // NOI18N
            tokenStr = token.nextToken();
            newFile.setAttr(tokenStr.equals(" ") ? null : new String(tokenStr)); // NOI18N
            tokenStr = token.nextToken();
            int size = 0;
            try {
                size = Integer.parseInt(tokenStr);
            } catch (NumberFormatException exc) {
                size = 0;
            }
            newFile.setSize(size);
            tokenStr = token.nextToken();
            newFile.setDate(tokenStr.equals(" ") ? null : new String(tokenStr)); // NOI18N
            tokenStr = token.nextToken();
            newFile.setTime(tokenStr.equals(" ") ? null : new String(tokenStr)); // NOI18N
        } else {
            //OLD BEHAVIOUR...
            if (token.hasMoreTokens()) {
                String tokenStr = token.nextToken();
                newFile.setRevision(tokenStr.equals("") ? null : tokenStr.intern()); // NOI18N
            }
        }
        if (!isJavaCvsCache || (isNew && 
            (newFile.getStatus().equals(JavaCvsStatusManager.NEEDS_CHECKOUT)
             || newFile.getStatus().equals(JavaCvsStatusManager.LOCALLY_REMOVED)))) {
//            if (par.getCacheName().equals(JavaCvsCache.JAVA_CACHE_NAME)) {
//                System.out.println("adding non-existent=" + newFile.getName());
            par.addFile(newFile, false);
            //par.setFirstTimer(true);
//            }
        }
        return newFile;
    }
    
    
    /** set the status..
     * @param stat any of the status constants in this class
     */
    public void setStatus (String stat) {
        String status = getStatus();
        //TODO the status changing logic move someplace else.
        //        if (status.equals(LOCAL)) return; // local files don't change status
        if (JavaCvsStatusManager.LOCALLY_ADDED.equals(status) && 
            JavaCvsStatusManager.LOCALLY_MODIFIED.equals(stat)) return; // for loc added files, ignore modified updates
        if (JavaCvsStatusManager.NEEDS_PATCH.equals(status) && 
            JavaCvsStatusManager.LOCALLY_MODIFIED.equals(stat)) {
            status = JavaCvsStatusManager.NEEDS_MERGE;
        } else {
            // TODO? other status logic to be added
            status = stat;
        }
        super.setStatus(status);
        //getParent().setModified(true);
    }
    
    /** does not set the setModified flag on the directory.. should be called
     * only when reading from disk cache
     * not modified -> read from disk, populated from local disk.
     */
    public void setStatusNonModifying(String stat) {
        setStatus(stat);
    }
    
    
    //-------------------------------------------
    public String toString(){
        return "CvsCacheFile["+ // NOI18N
        "name='"+getName()+"'"+ // NOI18N
        "]"; // NOI18N
    }
    
    protected static class CvsPersistentData extends PersistentData {
        
        public CvsPersistentData(boolean directory) {
            super(directory);
            this.setLocal(true);
            this.setStatus(null);
            setLocker(null);
            setRevision(null);
            setSticky(null);
            setAttr(null);
            setDate(null);
            setTime(null);
        }
        
        public String writeLineToDisk() {
            StringBuffer buff = new StringBuffer("/"); // NOI18N
            buff.append(getName());
            buff.append("/"); // NOI18N
            buff.append(getStatus());
            buff.append("/"); // NOI18N
            buff.append((getLocker() == null) ? " " : getLocker()); // NOI18N
            buff.append("/"); // NOI18N
            buff.append((getRevision() == null) ? " " : getRevision()); // NOI18N
            buff.append("/");  // NOI18N
            buff.append((getSticky() == null) ? " " : getSticky()); // NOI18N
            buff.append("/");  // NOI18N
            buff.append((getAttr() == null) ? " " : getAttr()); // NOI18N
            buff.append("/");  // NOI18N
            buff.append(getSize());
            buff.append("/");  // NOI18N
            buff.append((getDate() == null) ? " " : getDate()); // NOI18N
            buff.append("/");  // NOI18N
            buff.append((getTime() == null) ? " " : getTime()); // NOI18N
            
            //TODO
            return buff.toString();
        }
        
        /**
         * Subclasses need to implement this to store the data into disk cache.
         */
        protected void doWriteToDisk() throws IOException {
        }
        
    }
    
}


... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.