* Implement createResource() method so child resources can be used even if they don't exist
* Fix horrible bug in update() where child items were created that weren't child resources at all
This commit is contained in:
		
							parent
							
								
									cb02290e3d
								
							
						
					
					
						commit
						7af9cc6a22
					
				
					 3 changed files with 66 additions and 19 deletions
				
			
		| 
						 | 
					@ -55,10 +55,14 @@ public abstract class AbstractRepository implements Repository {
 | 
				
			||||||
    String shortName;
 | 
					    String shortName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     *
 | 
					     * Called to check the repository's content.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public abstract void update();
 | 
					    public abstract void update();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Called to create a child resource for this repository
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected abstract Resource createResource(String name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
| 
						 | 
					@ -83,7 +87,13 @@ public abstract class AbstractRepository implements Repository {
 | 
				
			||||||
    public Resource getResource(String name) {
 | 
					    public Resource getResource(String name) {
 | 
				
			||||||
        update();
 | 
					        update();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return (Resource) resources.get(name);
 | 
					        Resource res = (Resource) resources.get(name);
 | 
				
			||||||
 | 
					        // if resource does not exist, create it
 | 
				
			||||||
 | 
					        if (res == null) {
 | 
				
			||||||
 | 
					            res = createResource(name);
 | 
				
			||||||
 | 
					            resources.put(name, res);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return res;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public Iterator getResources() {
 | 
					    public Iterator getResources() {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -165,6 +165,13 @@ public class FileRepository extends AbstractRepository {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Called to create a child resource for this repository
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected Resource createResource(String name) {
 | 
				
			||||||
 | 
					        return new FileResource(new File(dir, name), this);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public int hashCode() {
 | 
					    public int hashCode() {
 | 
				
			||||||
        return 17 + (37 * dir.hashCode());
 | 
					        return 17 + (37 * dir.hashCode());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,6 +32,8 @@ public final class ZipRepository extends AbstractRepository {
 | 
				
			||||||
    // the nested directory depth of this repository
 | 
					    // the nested directory depth of this repository
 | 
				
			||||||
    private int depth;
 | 
					    private int depth;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    String entryPath;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private long lastModified = -1;
 | 
					    private long lastModified = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
| 
						 | 
					@ -52,10 +54,10 @@ public final class ZipRepository extends AbstractRepository {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Constructs a ZipRepository using the zip entry belonging to the given
 | 
					     * Constructs a ZipRepository using the zip entryName belonging to the given
 | 
				
			||||||
     * zip file and top-level repository
 | 
					     * zip file and top-level repository
 | 
				
			||||||
     * @param file a zip file
 | 
					     * @param file a zip file
 | 
				
			||||||
     * @param zipentry zip entry
 | 
					     * @param zipentry zip entryName
 | 
				
			||||||
     * @param parent repository
 | 
					     * @param parent repository
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private ZipRepository(File file, Repository parent, ZipEntry zipentry) {
 | 
					    private ZipRepository(File file, Repository parent, ZipEntry zipentry) {
 | 
				
			||||||
| 
						 | 
					@ -65,10 +67,12 @@ public final class ZipRepository extends AbstractRepository {
 | 
				
			||||||
        if (zipentry == null) {
 | 
					        if (zipentry == null) {
 | 
				
			||||||
            name = shortName = file.getName();
 | 
					            name = shortName = file.getName();
 | 
				
			||||||
            depth = 0;
 | 
					            depth = 0;
 | 
				
			||||||
 | 
					            entryPath = "";
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            String[] entrypath = StringUtils.split(zipentry.getName(), "/");
 | 
					            String[] pathArray = StringUtils.split(zipentry.getName(), "/");
 | 
				
			||||||
            depth = entrypath.length;
 | 
					            depth = pathArray.length;
 | 
				
			||||||
            shortName = entrypath[depth - 1];
 | 
					            shortName = pathArray[depth - 1];
 | 
				
			||||||
 | 
					            entryPath = zipentry.getName();
 | 
				
			||||||
            name = new StringBuffer(parent.getName())
 | 
					            name = new StringBuffer(parent.getName())
 | 
				
			||||||
                                   .append('/').append(shortName).toString();
 | 
					                                   .append('/').append(shortName).toString();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -92,31 +96,40 @@ public final class ZipRepository extends AbstractRepository {
 | 
				
			||||||
            try {
 | 
					            try {
 | 
				
			||||||
                zipfile = getZipFile();
 | 
					                zipfile = getZipFile();
 | 
				
			||||||
                Enumeration en = zipfile.entries();
 | 
					                Enumeration en = zipfile.entries();
 | 
				
			||||||
                ArrayList newRepositories = new ArrayList();
 | 
					                HashMap newRepositories = new HashMap();
 | 
				
			||||||
                HashMap newResources = new HashMap();
 | 
					                HashMap newResources = new HashMap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                while (en.hasMoreElements()) {
 | 
					                while (en.hasMoreElements()) {
 | 
				
			||||||
                    ZipEntry entry = (ZipEntry) en.nextElement();
 | 
					                    ZipEntry entry = (ZipEntry) en.nextElement();
 | 
				
			||||||
                    String entryname = entry.getName();
 | 
					                    String eName = entry.getName();
 | 
				
			||||||
                    String[] entrypath = StringUtils.split(entryname, "/");
 | 
					
 | 
				
			||||||
 | 
					                    if (!eName.regionMatches(0, entryPath, 0, entryPath.length())) {
 | 
				
			||||||
 | 
					                        // not a child of ours
 | 
				
			||||||
 | 
					                        continue;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    String[] entrypath = StringUtils.split(eName, "/");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    // create new repositories and resources for all entries with a
 | 
					                    // create new repositories and resources for all entries with a
 | 
				
			||||||
                    // path depth of this.depth + 1
 | 
					                    // path depth of this.depth + 1
 | 
				
			||||||
                    if (entrypath.length == depth + 1) {
 | 
					                    if (entrypath.length == depth + 1 && !entry.isDirectory()) {
 | 
				
			||||||
                        if (entry.isDirectory()) {
 | 
					                        // create a new child resource
 | 
				
			||||||
                            newRepositories.add(new ZipRepository(file, this, entry));
 | 
					 | 
				
			||||||
                        } else {
 | 
					 | 
				
			||||||
                        ZipResource resource = new ZipResource(file, entry, this);
 | 
					                        ZipResource resource = new ZipResource(file, entry, this);
 | 
				
			||||||
                        newResources.put(resource.getShortName(), resource);
 | 
					                        newResources.put(resource.getShortName(), resource);
 | 
				
			||||||
 | 
					                    } else if (entrypath.length > depth) {
 | 
				
			||||||
 | 
					                        // create a new child repository
 | 
				
			||||||
 | 
					                        if (!newRepositories.containsKey(entrypath[depth])) {
 | 
				
			||||||
 | 
					                            ZipEntry child = composeChildEntry(entrypath[depth]);
 | 
				
			||||||
 | 
					                            ZipRepository rep = new ZipRepository(file, this, child);
 | 
				
			||||||
 | 
					                            newRepositories.put(entrypath[depth], rep);
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                repositories = (Repository[])
 | 
					                repositories = (Repository[]) newRepositories.values()
 | 
				
			||||||
                        newRepositories.toArray(new Repository[newRepositories.size()]);
 | 
					                        .toArray(new Repository[newRepositories.size()]);
 | 
				
			||||||
                resources = newResources;
 | 
					                resources = newResources;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            } catch (IOException ex) {
 | 
					            } catch (Exception ex) {
 | 
				
			||||||
                ex.printStackTrace();
 | 
					                ex.printStackTrace();
 | 
				
			||||||
                repositories = new Repository[0];
 | 
					                repositories = new Repository[0];
 | 
				
			||||||
                if (resources == null) {
 | 
					                if (resources == null) {
 | 
				
			||||||
| 
						 | 
					@ -134,6 +147,23 @@ public final class ZipRepository extends AbstractRepository {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private ZipEntry composeChildEntry(String name) {
 | 
				
			||||||
 | 
					        if (entryPath == null || entryPath.length() == 0) {
 | 
				
			||||||
 | 
					            return new ZipEntry(name);
 | 
				
			||||||
 | 
					        } else if (entryPath.endsWith("/")) {
 | 
				
			||||||
 | 
					            return new ZipEntry(entryPath + name);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            return new ZipEntry(entryPath + "/" + name);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Called to create a child resource for this repository
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    protected Resource createResource(String name) {
 | 
				
			||||||
 | 
					        return new ZipResource(file, new ZipEntry(entryPath + "/" + name), this);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public long getChecksum() {
 | 
					    public long getChecksum() {
 | 
				
			||||||
        return file.lastModified();
 | 
					        return file.lastModified();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue