* Actually add embedded top-level repositories to the app's repositories
* Simplify last-top-level-repository check in TypeManager * Fix Application.getAppDir()
This commit is contained in:
		
							parent
							
								
									92da97550c
								
							
						
					
					
						commit
						908424d18a
					
				
					 2 changed files with 77 additions and 26 deletions
				
			
		|  | @ -46,17 +46,20 @@ public final class Application implements IPathElement, Runnable { | ||||||
|     // the name of this application |     // the name of this application | ||||||
|     private String name; |     private String name; | ||||||
| 
 | 
 | ||||||
|  |     // application sources | ||||||
|  |     ArrayList repositories; | ||||||
|  | 
 | ||||||
|     // properties and db-properties |     // properties and db-properties | ||||||
|     ResourceProperties props; |     ResourceProperties props; | ||||||
| 
 | 
 | ||||||
|     // properties and db-properties |     // properties and db-properties | ||||||
|     ResourceProperties dbProps; |     ResourceProperties dbProps; | ||||||
| 
 | 
 | ||||||
|     // Helma server home directory |     // This application's main directory | ||||||
|     File home; |     File appDir; | ||||||
| 
 | 
 | ||||||
|     // application sources |     // Helma server hopHome directory | ||||||
|     ArrayList repositories; |     File hopHome; | ||||||
| 
 | 
 | ||||||
|     // embedded db directory |     // embedded db directory | ||||||
|     File dbDir; |     File dbDir; | ||||||
|  | @ -138,7 +141,7 @@ public final class Application implements IPathElement, Runnable { | ||||||
|     private CryptResource pwfile; |     private CryptResource pwfile; | ||||||
| 
 | 
 | ||||||
|     // Map of java class names to object prototypes |     // Map of java class names to object prototypes | ||||||
|    ResourceProperties classMapping; |     ResourceProperties classMapping; | ||||||
| 
 | 
 | ||||||
|     // Map of extensions allowed for public skins |     // Map of extensions allowed for public skins | ||||||
|     Properties skinExtensions; |     Properties skinExtensions; | ||||||
|  | @ -211,10 +214,10 @@ public final class Application implements IPathElement, Runnable { | ||||||
|         ResourceProperties sysDbProps; |         ResourceProperties sysDbProps; | ||||||
| 
 | 
 | ||||||
|         sysProps = sysDbProps = null; |         sysProps = sysDbProps = null; | ||||||
|         home = null; |         hopHome = null; | ||||||
| 
 | 
 | ||||||
|         if (server != null) { |         if (server != null) { | ||||||
|             home = server.getHopHome(); |             hopHome = server.getHopHome(); | ||||||
| 
 | 
 | ||||||
|             if (dbDir == null) { |             if (dbDir == null) { | ||||||
|                 dbDir = new File(server.getDbHome(), name); |                 dbDir = new File(server.getDbHome(), name); | ||||||
|  | @ -229,6 +232,13 @@ public final class Application implements IPathElement, Runnable { | ||||||
|             dbDir.mkdirs(); |             dbDir.mkdirs(); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         for (int i=0; i<repositories.length; i++) { | ||||||
|  |             if (repositories[i] instanceof FileRepository) { | ||||||
|  |                 appDir = new File(repositories[i].getName()); | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         // give the Helma Thread group a name so the threads can be recognized |         // give the Helma Thread group a name so the threads can be recognized | ||||||
|         threadgroup = new ThreadGroup("TX-" + name); |         threadgroup = new ThreadGroup("TX-" + name); | ||||||
| 
 | 
 | ||||||
|  | @ -245,8 +255,8 @@ public final class Application implements IPathElement, Runnable { | ||||||
|         // the passwd file, to be used with the authenticate() function |         // the passwd file, to be used with the authenticate() function | ||||||
|         CryptResource parentpwfile = null; |         CryptResource parentpwfile = null; | ||||||
| 
 | 
 | ||||||
|         if (home != null) { |         if (hopHome != null) { | ||||||
|             parentpwfile = new CryptResource(new FileResource(new File(home, "passwd")), null); |             parentpwfile = new CryptResource(new FileResource(new File(hopHome, "passwd")), null); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         pwfile = new CryptResource(repositories[0].getResource("passwd"), parentpwfile); |         pwfile = new CryptResource(repositories[0].getResource("passwd"), parentpwfile); | ||||||
|  | @ -435,18 +445,30 @@ public final class Application implements IPathElement, Runnable { | ||||||
|         sessionMgr.shutdown();         |         sessionMgr.shutdown();         | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * Returns true if this app is currently running | ||||||
|  |      * | ||||||
|  |      * @return | ||||||
|  |      */ | ||||||
|     public synchronized boolean isRunning() { |     public synchronized boolean isRunning() { | ||||||
|         return running; |         return running; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * Get the application directory. | ||||||
|  |      * | ||||||
|  |      * @return | ||||||
|  |      */ | ||||||
|     public File getAppDir() { |     public File getAppDir() { | ||||||
|         try { |         return appDir; | ||||||
|             return new File(((FileRepository) getRepositories().next()).getName()); |  | ||||||
|         } catch (ClassCastException ex) { |  | ||||||
|             return null; |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * Get a comparator for comparing Resources according to the order of | ||||||
|  |      * repositories they're contained in. | ||||||
|  |      * | ||||||
|  |      * @return | ||||||
|  |      */ | ||||||
|     public ResourceComparator getResourceComparator() { |     public ResourceComparator getResourceComparator() { | ||||||
|         return resourceComparator; |         return resourceComparator; | ||||||
|     } |     } | ||||||
|  | @ -1569,6 +1591,33 @@ public final class Application implements IPathElement, Runnable { | ||||||
|         return name; |         return name; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * Add a repository to this app's repository list. This is used for | ||||||
|  |      * ZipRepositories contained in top-level file repositories, for instance. | ||||||
|  |      * | ||||||
|  |      * @param rep | ||||||
|  |      * @return if the repository was not yet contained | ||||||
|  |      */ | ||||||
|  |     public boolean addRepository(Repository rep) { | ||||||
|  |         if (rep != null && !repositories.contains(rep)) { | ||||||
|  |             // Add the new repository before its parent repository. | ||||||
|  |             // This establishes the order of compilation between FileRepositories | ||||||
|  |             // and embedded ZipRepositories. | ||||||
|  |             Repository parent = rep.getParentRepository(); | ||||||
|  |             if (parent != null) { | ||||||
|  |                 int idx = repositories.indexOf(parent); | ||||||
|  |                 if (idx > -1) { | ||||||
|  |                     repositories.add(idx, rep); | ||||||
|  |                     return true; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             // no parent or parent not in app's repositories. | ||||||
|  |             repositories.add(rep); | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     /** |     /** | ||||||
|      * Searches for the index of the given repository for this app. |      * Searches for the index of the given repository for this app. | ||||||
|      * The arguement must be a root argument, or -1 will be returned. |      * The arguement must be a root argument, or -1 will be returned. | ||||||
|  | @ -1586,14 +1635,14 @@ public final class Application implements IPathElement, Runnable { | ||||||
|      * @return iterator through application repositories |      * @return iterator through application repositories | ||||||
|      */ |      */ | ||||||
|     public Iterator getRepositories() { |     public Iterator getRepositories() { | ||||||
|         return repositories.iterator(); |         return ((List) repositories.clone()).iterator(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Return the directory of the Helma server |      * Return the directory of the Helma server | ||||||
|      */ |      */ | ||||||
|     public File getServerDir() { |     public File getServerDir() { | ||||||
|         return home; |         return hopHome; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  |  | ||||||
|  | @ -39,8 +39,6 @@ public final class TypeManager { | ||||||
|     final static String skinExtension = ".skin"; |     final static String skinExtension = ".skin"; | ||||||
| 
 | 
 | ||||||
|     private Application app; |     private Application app; | ||||||
|     Repository[] repositories; |  | ||||||
|     long[] modified; |  | ||||||
|     // map of prototypes |     // map of prototypes | ||||||
|     private HashMap prototypes; |     private HashMap prototypes; | ||||||
| 
 | 
 | ||||||
|  | @ -49,6 +47,7 @@ public final class TypeManager { | ||||||
| 
 | 
 | ||||||
|     private long lastCheck = 0; |     private long lastCheck = 0; | ||||||
|     private long lastCodeUpdate; |     private long lastCodeUpdate; | ||||||
|  |     private long lastRepositoryScan; | ||||||
| 
 | 
 | ||||||
|     // app specific class loader, includes jar files in the app directory |     // app specific class loader, includes jar files in the app directory | ||||||
|     private AppClassLoader loader; |     private AppClassLoader loader; | ||||||
|  | @ -62,9 +61,6 @@ public final class TypeManager { | ||||||
|      */ |      */ | ||||||
|     public TypeManager(Application app) { |     public TypeManager(Application app) { | ||||||
|         this.app = app; |         this.app = app; | ||||||
|         repositories = new Repository[app.repositories.size()]; |  | ||||||
|         app.repositories.toArray(repositories); |  | ||||||
|         modified = new long[repositories.length]; |  | ||||||
|         prototypes = new HashMap(); |         prototypes = new HashMap(); | ||||||
|         jarfiles = new HashSet(); |         jarfiles = new HashSet(); | ||||||
| 
 | 
 | ||||||
|  | @ -124,7 +120,10 @@ public final class TypeManager { | ||||||
|         for (int i = 0; i < list.length; i++) { |         for (int i = 0; i < list.length; i++) { | ||||||
|             if (list[i].isScriptRoot()) { |             if (list[i].isScriptRoot()) { | ||||||
|                 // this is an embedded top-level script repository  |                 // this is an embedded top-level script repository  | ||||||
|                 checkRepository(list[i]); |                 if (app.addRepository(list[i])) { | ||||||
|  |                     // repository is new, check it | ||||||
|  |                     checkRepository(list[i]); | ||||||
|  |                 } | ||||||
|             } else { |             } else { | ||||||
|                 // its an prototype |                 // its an prototype | ||||||
|                 String name = null; |                 String name = null; | ||||||
|  | @ -162,11 +161,14 @@ public final class TypeManager { | ||||||
|      */ |      */ | ||||||
|     private void checkRepositories() throws IOException { |     private void checkRepositories() throws IOException { | ||||||
|         // check if any files have been created/removed since last time we checked... |         // check if any files have been created/removed since last time we checked... | ||||||
|         for (int i = 0; i < repositories.length; i++) { |         Iterator it = app.getRepositories(); | ||||||
|             if (repositories[i].lastModified() > modified[i]) { |         while (it.hasNext()) { | ||||||
|                 modified[i] = repositories[i].lastModified(); |             Repository repository = (Repository) it.next(); | ||||||
|  |             if (repository.lastModified() > lastRepositoryScan) { | ||||||
|  |                 lastRepositoryScan = Math.max(System.currentTimeMillis(), | ||||||
|  |                                               repository.lastModified()); | ||||||
| 
 | 
 | ||||||
|                 checkRepository(repositories[i]); |                 checkRepository(repository); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue