| <!-- saved from url=(0022)http://internet.e-mail --> |
| <!doctype html public "-//w3c//dtd html 4.0 transitional//en"> |
| <html> |
| <head> |
| <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> |
| <meta name="Author" content="Eclipse Project"> |
| <title>Towards More Flexible Project Structure</title> |
| <link rel="stylesheet" href="../../default_style.css" type="text/css"> |
| </head> |
| <body bgcolor="#FFFFFF" > |
| |
| <div align="left"> |
| <h1> Towards More Flexible Project Structure</h1> |
| </div> |
| <blockquote> |
| <p><b>Summary</b> <br> |
| Eclipse requires that the contents of each project be stored in a single directory |
| on disk. Every file and folder in that directory tree on disk must belong |
| to the project in the workspace. This restriction makes it difficult to use |
| Eclipse in conjunction with tools that have specific layout requirements for |
| their files, or with users who have legacy file base layouts that they need |
| to maintain. We would like to improve the situation for the 2.1 release of |
| Eclipse. There is a separate, first <a href="http://www.eclipse.org/eclipse/development/inflexible-projects-problem.html">document |
| describing the nature of the problem</a>. This document explores the space |
| of potential solutions, without drilling down into the details of any of them. |
| The proposed solution is described in a <a href="flexible-projects-proposal.html"> |
| follow-on document</a>.<br> |
| <br> |
| Last Modified: 17:00 October 24, 2002<br> |
| Changes from <a href="towards-more-flexible-projects_20021004.html">previous |
| version</a>: added JBuilder info; split option P-1 into P-1a and P-1b; split |
| option M-1 into M-1a and M-1b</p> |
| </blockquote> |
| <p>In this document we explore the space of potential solutions, to better |
| understand where the various aspects of the problem can and cannot be addressed. |
| Although much of the discussion will center around Java, the problems are likely not |
| confined to |
| Java and will affect tools for other languages. In most cases, we will have the option of addressing the problem at the JDT |
| level without changing the Eclipse Platform. This has its pros and cons. Pro: |
| the solution can be specialized for Java. Con: The solution would not apply to C |
| tools, for example. On the other hand, addressing the problem at the level of |
| the Eclipse Platform also has its pros and cons. Pro: The solution would apply |
| to C tools, etc. Con: The change may impact all tools and users. All this must be |
| factored in to the decision-making process.</p> |
| <p>In the final decision, we may only be able to address a subset of the |
| problems. But here we proceed with an unlimited budget for exploration.</p> |
| <h2>Pros of the current Eclipse</h2> |
| <p>Although the restrictions on the structure of Eclipse projects may come |
| across as inflexible to some, the current scheme has several important virtues:</p> |
| <ul> |
| <li>Single-rooted Eclipse project is simple to explain to users and plug-in |
| writers alike: All of a project's files are in a single file system |
| subdirectory. End of story.</li> |
| <li>All-inclusive Eclipse project means that the project resource tree is an |
| accurate in-memory model of the corresponding tree of files in the file |
| system. Plug-ins can quickly traverse the in-memory tree without having to |
| make expensive OS file IO calls. Tools that operate directly in the file |
| system can be readily integrated into Eclipse with the after-the-fact |
| application of a simple refresh mechanism to resynchronizes the resource |
| tree with the file system.</li> |
| <li>Non-overlapping Eclipse projects is simple. The mapping from files in the |
| file system to files in the workspace resource tree is 1-1, allowing |
| unambiguous lookup of a resource given a file system path. If projects |
| overlap, that mapping becomes 1-many (multiple distinct resource handles map |
| to the same file).</li> |
| </ul> |
| <h2>What do other IDEs do?</h2> |
| <p> |
| <b>NetBeans 3.4 (</b>and Sun ONE Studio, formerly Forte for Java)</p> |
| <ul> |
| <li>Projects are multi-rooted at the top-level.</li> |
| <li>To use sources and libraries in IDE they must be mounted as |
| filesystems.</li> |
| <li>Filesystem can be a local folder, an archive, or something from VCM.</li> |
| <li>Filesystems are all-inclusive by default. |
| <ul> |
| <li>Regular expression exclusion rules stated at filesystem root.</li> |
| <li>(Refresh rate also set at filesystem root; defaults to 15 |
| s.) </li> |
| </ul> |
| </li> |
| <li>Projects provide context for source files, compilation, and execution.</li> |
| <li>All work done in an open project.</li> |
| <li>Default project if none specified.</li> |
| <li>Can define new projects.</li> |
| <li>Only one project open at a time.</li> |
| <li>Filesystems can be mounted into projects.</li> |
| <li>Filesystems can overlap between projects.</li> |
| <li>Filesystems can overlap even within projects.</li> |
| <li>Project level control of location of generated class files. |
| <ul> |
| <li>Next to source file (default).</li> |
| <li>Output to specific filesystem.</li> |
| </ul> |
| </li> |
| </ul> |
| <b>IntelliJ IDEA 2.6</b> |
| <ul> |
| <li>Projects are multi-rooted at the top-level.</li> |
| <li>Roots are directories or JARs in file system. |
| <ul> |
| <li>Automagically computes correct source folder based on where it |
| finds Java source files</li> |
| </ul> |
| </li> |
| <li>All files under root directory are included in project.</li> |
| <li><i>Remove</i> a root from project; <i>delete</i> a file or folder from |
| a root.</li> |
| <li>Info about project is kept in separate project configuration file |
| named <ProjectName>.ipr</li> |
| <li>Project has compiler option for ignoring specified files or |
| subdirectories.</li> |
| <li>Workspace consists of a single open project.</li> |
| <li>Default project if none specified.</li> |
| <li>Can define new projects.</li> |
| <li>Only one project open at a time. |
| <ul> |
| <li>But you can run multiple instances of IDE at same time.</li> |
| </ul> |
| </li> |
| <li>Separate projects are free to overlap (no special support).</li> |
| <li>Within a project, separate roots may overlap.</li> |
| <li>Source files appearing under more than one root generate compile |
| errors. |
| <ul> |
| <li>Cannot be remedied with compiler option.</li> |
| </ul> |
| </li> |
| <li>One output folder per project. |
| <ul> |
| <li>Location of generated class files is a project property.</li> |
| <li>(But...IDEA 3.0 is more flexible: different output folder for each |
| source folder)</li> |
| </ul> |
| </li> |
| </ul> |
| <b>Together® ControlCenter 6.0.1</b> |
| <ul> |
| <li>Projects are multi-rooted at the top-level.</li> |
| <li>Roots are directories or JARs in file system.</li> |
| <li>Roots are added and removed only in project properties dialog.</li> |
| <li>All files under root directory are included in project unless excluded |
| by a "skip path" entry.</li> |
| <li>Info about project is kept in separate project file named |
| <ProjectName>.tpr.</li> |
| <li>Project file is kept in primary root directory along with other |
| project-level property files.</li> |
| <li>Workspace consists of a single open project.</li> |
| <li>Can define new projects.</li> |
| <li>Only one project open at a time. |
| <ul> |
| <li>But you can run multiple instances of IDE at same time.</li> |
| </ul> |
| </li> |
| <li>Separate projects are free to overlap (no special support).</li> |
| <li>Within a project, separate roots may overlap.</li> |
| <li>Source files appearing under more than one root generate compile |
| errors. |
| <ul> |
| <li>Can be remedied with "skip path" feature.</li> |
| </ul> |
| </li> |
| <li>Location of generated class files is internal and unspecified.</li> |
| </ul> |
| <p> |
| <b>Borland® JBuilder Enterprise 7</b></p> |
| <ul> |
| <li>Projects are multi-rooted at the top-level.</li> |
| <li>Roots are directories in file system (source paths).</li> |
| <li>Source paths are added and removed only in project properties dialog.</li> |
| <li>All Java source files under a source path are included in project. |
| <ul> |
| <li>Can explicitly exclude a package in regular Browser.</li> |
| </ul> |
| </li> |
| <li>Info about project is kept in separate project file named |
| <ProjectName>.jpx.</li> |
| <li>Project file is kept in project directory.</li> |
| <li>Project directory defaults to C:\Documents and Settings\<user>\jbproject\<ProjectName>\</li> |
| <li>Project directory is default location for everything (source, class |
| files, doc, etc.)</li> |
| <li>Source path defaults to <project directory>/src</li> |
| <li>Single output path per project.</li> |
| <li>Output path defaults to <project directory>/classes</li> |
| <li>Any number of projects can be open in a browser at a time.</li> |
| <li>Browser only shows one project at a time.</li> |
| <li>There can be multiple browsers; same project can be open in several.</li> |
| <li>Separate projects are free to overlap (no special support).</li> |
| <li>Within a project, separate source paths may overlap. |
| <ul> |
| <li>Longer source path "steals" subtree from the source |
| paths it overlaps.</li> |
| </ul> |
| </li> |
| <li>Project can also have loose source files not appearing in a package |
| directory. |
| </li> |
| </ul> |
| <p> |
| <b>Microsoft Development Environment 2002 Version 7 (Visual Studio .NET)</b> |
| </p> |
| <p>[This section is incomplete]</p> |
| <ul> |
| <li>Projects come in various types. |
| <ul> |
| <li>Some types of projects (e.g., Visual Basic Web and Visual C# .NET |
| Web projects) are a single-rooted tree of files</li> |
| <li>Some types of projects (e.g., Visual C++ .NET projects) consist |
| entirely of links to individual files</li> |
| <li>Some types of projects (e.g., Visual Basic .NET and Visual C# .NET |
| projects) are a mix of both, primarily </li> |
| </ul> |
| </li> |
| <li>File inclusion is inherently selective. |
| <ul> |
| <li>There are Include in Project and Exclude from Project menu items.</li> |
| </ul> |
| </li> |
| <li>Workspace consists of several projects (collected into solutions).</li> |
| <li>[TBD - whether projects are allowed to coincide or overlap]</li> |
| </ul> |
| <h2>Improving the Output Folder</h2> |
| <p>How could we change Eclipse to make the Java output folder more flexible?</p> |
| <p>Here are some options (in no particular order):</p> |
| <p><b>Option P-1a</b>: Change JDT to allow the output folder to be external to |
| the workspace.</p> |
| <p>JDT allows library JARs to be either local to a Java project (specified by |
| workspace path) or external to the workspace (specified by an absolute file |
| system path). So one option is to be similarly flexible with the location of a |
| Java project's output folder.</p> |
| <p>This would entail changing JDT Core API as well as JDT UI, but could likely |
| be done in a non-breaking fashion.</p> |
| <p>The chief drawback of this approach is that there would be no resource deltas |
| for tracking changes to files in a project's output folder in the case where it |
| was external to the workspace. This would have serious repercussions in at least |
| three areas: (a) the JDT debugger's HotSwap facility relies on resource deltas to |
| class files in the output folder; (b) the Java incremental project builder uses |
| builder-supplied resource deltas to track changes to class files in dependent |
| projects, and (c) other incremental project builders on the same project would |
| be unable to track changes to anything in the output folder as well. Without resource deltas, it is hard to see how either could be |
| supported.</p> |
| <p>A smaller drawback is that any code that creates and reads class files in the |
| output folder would have to be written in such a way that it could deal with |
| resources in the workspace (using resource handles provided by the workspace |
| API) and outside the workspace (using java.io.File API directly).</p> |
| <p><b>Option P-1b</b>: Change JDT to allow the output folder to be in a |
| different project.</p> |
| <p>A user could designate that a Java project's generated class files be created |
| in another project. Since each project can reside on a different drive, this |
| arrangement would allow the Java project to live on a network drive with its |
| generated class files living on a local drive, or wherever.</p> |
| <p>The advantage of this arrangement is that it does not require new concepts.</p> |
| <p>The chief drawback is that it may force users into creating additional |
| "storage" projects. In the worst case, these projects are nothing more |
| than a bunch of files (no builders, no VCM). It should be possible to hide such |
| projects from the user.</p> |
| <p>This change would break existing clients that assume that all generated class |
| files for a Java project are always located within the project itself. </p> |
| <p><b>Option P-2</b>: Change Eclipse Platform workspace to allow arbitrary |
| directory in the file system to be "mounted" as a folder inside a |
| project.</p> |
| <p>A user would then be able to mount an external file system subdirectory into |
| their Java project, and designate their output folder at (or below) that mount |
| point. The net effect is that the generated class files would be written |
| directly to the desired location. As long as mounted subdirectories are |
| considered to be a regular part of the project's file, the regular resource API |
| and resource deltas apply. JDT would not even need to be aware that the output |
| folder was separated from the rest of the project's files.</p> |
| <p>The pros and cons of this approach are chiefly those of mount points |
| generally (covered below).</p> |
| <p>PDE launches a runtime |
| workbench with a special command line option specifying one or more |
| plug-in-relative paths (e.g., -dev bin) that are to be included on each plug-in |
| class loader's class path. PDE includes the project-relative paths of all output |
| folders; this is just the path "bin" when all plug-in projects locate |
| their output folder in the default location. If an external directory is mounted |
| as a Java project's output folder, the existing Eclipse Platform Core Runtime |
| mechanisms would need to be revamped to allow PDE to supply an absolute file |
| system path for each plug-in.</p> |
| <p>Some other observations:</p> |
| <ul> |
| <li>JDT marks the output folder as containing "derived" resources, |
| and repository providers tend to ignore resources marked as |
| "derived". This means that it probably does not matter whether a |
| mounted folder is considered part of the project for VCM purposes.</li> |
| <li>If the JDT UI exposes the support for mounting the output folder, there |
| would be no need to provide generic mount support in the Workbench UI. This |
| would allow the complicating nature of mount points to be confined to the |
| types of projects that are prepared for them.</li> |
| </ul> |
| <p><b>Option P-3</b>: Advocate use of OS-level symlinks. </p> |
| <p>Unix file system have symlinks, and Windows 2000 NTFS has an unsupported |
| feature called <a href="http://www.sysinternals.com/ntw2k/source/misc.shtml#junction">junctions</a>. These |
| file system mechanisms allow a directory in one part of the file system to be |
| linked in to somewhere else. For example, if the project root directory of |
| Project1 is C:/myws/project1 and the Java output folder is in its standard |
| location, a symlink from C:/myws/project1/bin to C:/tomcat/webapps/mytest/WEB-INF/classes |
| ensures that the files in the output folder are created directly in the web |
| server's subdirectory. </p> |
| <p>The advantage of this option is that the user can create this arrangement |
| using existing OS-specific tools, and does not require explicit support from the |
| Eclipse. So this option is already supported in 2.0. </p> |
| <p>Operating systems may have restrictions on symlinks that make this option less |
| workable for some purposes. For instance, NTFS junctions work on Windows |
| 2000 or better, and only work within |
| and between local drives. Furthermore, junctions are an unsupported feature. </p> |
| <p><b>Option P-4</b>: Advocate use of external tool builders for copying the output folder to an |
| external location. </p> |
| <p>Eclipse allows the user to add Ant-scripted steps as an external tool |
| builder. Coping new and changed files from the output folder to another location |
| can be done with one Ant command. </p> |
| <p>This option is low-tech and works in Eclipse 2.0; however, it only ensures |
| that the files in the output folder end up in the desired location; it does not |
| reduce the network traffic when the project's files are stored on a network |
| drive. </p> |
| <p><b>Option Q-1 (orthogonal)</b>: Allow one output folder per source folder. </p> |
| <p>Orthogonal to the other options, flexibility could be improved by allowing |
| different output folders to be specified for each source folder. In other words, |
| allowing the output folder could be partitioned along source folder lines. The |
| changes allows, for example, a single Java project to contain both product |
| source code and test suites partitioned into separate source and output |
| folders. </p> |
| <p>The additional output folders would need to find their way onto the runtime |
| class path, and the debugger would need to know how to map from generated class |
| file to source file. Neither should be a problem. </p> |
| <p>This change would break existing clients that assume that all generated class |
| files for a Java project are in a single output folder. </p> |
| <h3>Assessment </h3> |
| <ul> |
| <li>P-1a is a non-starter.</li> |
| <li>P-1b is promising, but requires changes to JDT. </li> |
| <li>P-2 is promising, but requires changes to the Eclipse Platform. </li> |
| <li>P-3 requires no work but is only a partial solution.</li> |
| <li>P-4 requires no work but is only a partial solution.</li> |
| </ul> |
| <h2>Allowing Multi-rooted Projects</h2> |
| <p>How could we change Eclipse to make Java projects (source folders in |
| particular) be multi-rooted rather than single-rooted?</p> |
| <p>Here are some options (in no particular order):</p> |
| <p><b>Option M-1a</b>: Change JDT to allow a Java project source folder to lie outside the workspace.</p> |
| <p>Supporting a source folder outside the workspace entirely would have many of |
| the same problems as with external output folders. These files would need to be |
| accessed with java.io.File API (not resource handles), and there would be no |
| resource deltas for updating the Java model or triggering recompilation.</p> |
| <p><b>Option M-1b</b>: Change JDT to allow a Java project source folder to lie |
| inside another project.</p> |
| <p>It would be relatively straightforward to allow a source folder for a Java |
| project to lie inside a different Java project. Because these files are still |
| inside the workspace, resource deltas can still be used for updating the Java |
| model and triggering recompilation. Since each project can reside on a different |
| drive, this arrangement would allow a Java project's source files to be drawn |
| from several places in the file system..</p> |
| <p>The advantage of this arrangement is that it does not require new concepts.</p> |
| <p>The chief drawback is that it may force users into creating additional |
| "storage" projects.</p> |
| <p>This change would break existing clients that assume that source files for a Java project are |
| always located within the project itself. </p> |
| <p><b>Option M-2</b>: Change Eclipse Platform to "mount" a file system |
| directory as a project folder.</p> |
| <p>We would add a new workspace concept of mount points, and allow a directory |
| in the file system to be grafted into a project's resource tree. For example, |
| mounting C:/JavaSources at /Project1/src would mean that the files and folders |
| under /Project1/src are stored under the subdirectory C:/JavaSources; e.g., the |
| file C:/JavaSources/com/example/Egg.java would appear in the workspace at the |
| resource path /Project1/src/com/example/Egg.java. Any project files not below a |
| mount point would be held within the project's root directory, as they are |
| currently. Tools that navigate the resource tree using the workspace API need |
| not be aware of the file's location. </p> |
| <p>It would also be possible to allow a portion of one project's resource tree |
| to be directly grafted into another (instead of doing this indirectly through the file system). |
| This implies some form of overlap be allowed.</p> |
| <p> |
| With the ability to mount a file system directory into the root of a project, a |
| Java project can have its source folders in different locations on disk. |
| </p> |
| <p> |
| This would be a breaking change for clients of the workspace because it alters the current |
| implicit understanding that all project contents are stored in one file system |
| subtree. However, it should be possible to minimize the effects of this breakage |
| and provide good compatibility with existing 2.0 tools and team (VCM) providers. |
| </p> |
| <p><b>Option M-3</b>: Advocate use of OS-level symlinks. </p> |
| <p>The use of symlinks is discussed above (Output Folder, Option P-3). These are |
| the file system equivalents of the mount points in Option M-2. </p> |
| <p>The advantage of this option is that the user can create this arrangement |
| using existing OS-specific tools, and does not require explicit support from the |
| Eclipse. So this option is already supported in 2.0. </p> |
| <p>Operating systems may have restrictions on symlinks that make this option less |
| workable for some purposes. For instance, NTFS junctions work on Windows |
| 2000 or better, and only work within |
| and between local drives. Furthermore, junctions are an unsupported feature. </p> |
| <h3>Assessment </h3> |
| <ul> |
| <li>M-1a is a non-starter.</li> |
| <li>M-1b is promising, but requires changes to JDT. </li> |
| <li>M-2 is promising, but requires changes to the Eclipse Platform (same |
| change as P-2). </li> |
| <li>M-3 requires no work but is only a partial solution.</li> |
| </ul> |
| <h2>Allowing Selectivity</h2> |
| <p>How could we change Eclipse to make the Java source folders selective rather |
| than all-inclusive?</p> |
| <p>Here are some options (in no particular order):</p> |
| <p><b>Option S-1</b>: Change Eclipse Platform to add support for resource working sets with the capability to browse and manipulate a subset of the workspace where certain files and folders are excluded.</p> |
| <p>This option does not involve changing the nature of the workspace resource |
| tree and its relation to the file system. It simply adds ways to provide |
| filtered views of that resource tree.</p> |
| <p>A Java project source folder is currently specified with a project-relative |
| folder path. All *.java source files found in the project subtree are |
| automatically included in the Java model and on the Java compiler's class |
| path. The source folder specification could be enhanced to permit the user to |
| specify which files and folders to exclude (think <a href="http://jakarta.apache.org/ant/manual/CoreTypes/fileset.html">Ant |
| filesets</a>).</p> |
| <p>The source folders of a Java project are not currently allowed to coincide or |
| otherwise overlap. Some relaxation of this rule is required to handle the case where a source folder |
| containing tests is nested inside the main source folder (<a href="http://www.eclipse.org/eclipse/development/inflexible-projects-problem.html">Example |
| 3</a>). One relaxation is to allow source folders to coincide or overlap but use the mechanism for excluding |
| files to prevent the same file from being included in both source folders.</p> |
| <p>This option would entail changing Eclipse Platform Core to provide infrastructure, possibly in the form of a rule-based resource |
| visitor. We would explore a possible connection to the existing UI notion of working sets. JDT Core API |
| and JDT UI would need to change as well, but could |
| likely be done in a non-breaking manner by adding working sets to |
| classpath entries (<a href="http://dev.eclipse.org:8080/help/content/help:/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/IClasspathEntry.html">IClasspathEntry</a>) |
| and revamping the rules for legal source folder overlap.</p> |
| <p><b>Option S-2 (orthogonal)</b>: Change JDT to allow overlapping source folders but |
| automatically exclude the overlapped portion from the parent.</p> |
| <p>A different approach is to provide the kind of selectivity required to handle |
| cases like where a source folder |
| containing tests is nested inside the main source folder (<a href="http://www.eclipse.org/eclipse/development/inflexible-projects-problem.html">Example |
| 3</a>). The solution is to allow the overlap, but automatically exclude the |
| files accounted for by the more specific folder from the less specific one. For |
| example, if /src/ and /src/tests/ as both specified as source folders, files |
| under /src/tests/ would only appear under the latter source folder, and the |
| former source folder would act as if it had no child named tests.</p> |
| <p>This option would involve a non-breaking change to JDT to remove the current |
| restrictions that prohibit overlap and define how overlapping source folders are |
| interpreted. This option is orthogonal to the other selectivity options, and |
| could be done in conjunction with any of them.</p> |
| <p><b>Option S-3</b>: Radically change the Eclipse Platform policy for adding and removing |
| files from the workspace.</p> |
| <p>The workspace folder refresh operation (<a href="http://dev.eclipse.org:8080/help/content/help:/org.eclipse.platform.doc.isv/reference/api/org/eclipse/core/resources/IResource.html#refreshLocal">IResource.refreshLocal</a>) automatically creates entries in the workspace resource tree |
| for newly discovered files and folders out in the file system, and discards |
| entries for any files and folders that are no longer present in the file system. |
| (This refresh action is also implicit in a number of workspace operations when |
| the force flag is used). This characteristic makes a project's workspace |
| resource tree a more-or-less faithful mirror of the project's subtree in the |
| file system. This gives workspace projects their all-inclusive feel.</p> |
| <p>There are other IDEs (including Visual Studio .net) that allow the user to |
| control which files and folders belong in a project; other files and folders may |
| exist in the local file system, but are simply ignored by the IDE if not flagged |
| as belonging to the project. This characteristic means that the IDE's notion of |
| project is more like a "view" onto files in the file system. This |
| alternate conception of workspace could be achieved by changing Eclipse policy |
| so that file and folder entries are never added to or removed from the resource |
| tree due to a refresh operation; new API would be added so that entries could be |
| added or removed explicitly. This would give workspace projects a selective |
| feel.</p> |
| <p>On the plus side, the resource tree would be smaller if some files and |
| folders were to be excluded, and this would improve performance. It would also |
| reduce workspace clutter and make Eclipse behave more like certain other popular |
| IDEs (Visual Studio .NET).</p> |
| <p>The downside of this option is that it is impossible to do while maintaining |
| compatibility. Consider an existing tool that is calling IResource.refreshLocal |
| to cause files created directly in the file system to appear in the workspace (a |
| common problem when bridging external programs to Eclipse). Changing the |
| semantics of IResource.refreshLocal so that it does not discover new files would |
| clearly break this tool. On the other hand, if the semantics of |
| IResource.refreshLocal is not changed, then running this tool would |
| automatically admit files to the workspace, even against the user's wishes. |
| Either path leads to a different kind of breakage.</p> |
| <p><b>Option S-4</b>: Add Eclipse Platform mechanism to prevent refreshLocal from |
| adding certain files to the workspace resource tree.</p> |
| <p>Another option is to change the Eclipse Platform refresh mechanism is a more |
| modest way to provide a way to selectively exclude files. If the refresh |
| operation was governed by exclusion rules, it would be possible for the user to |
| explicitly prevent certain files and folders in the file system from being added |
| automatically to the workspace. By default, there would be no exclusion rules, |
| and the workspace would behave exactly as in 2.0. If the user indicates that a |
| particular file or folder is to be excluded, the refresh operation would never |
| add it to the resource tree, even if the file or folder exists in the file |
| system. This would give workspace projects an initially all-inclusive feel which |
| could be made more selective as required.</p> |
| <p>New API would be required to change the exclusion rule set, to explicitly add |
| a file or folder to the resource tree even if on the excluded list, and to |
| remove a file or folder from the resource tree without deleting the file in the |
| file system. The semantics of IResource.refreshLocal would not have to change in |
| a breaking way. A project's workspace |
| resource tree is a more-or-less faithful mirror of the project's subtree in the |
| file system except for the files and folders that the user has explicitly taken |
| off the table.</p> |
| <p>On the plus side, the resource tree would be smaller if some files and |
| folders were to be excluded, and this would improve performance. It would also |
| reduce workspace clutter and make Eclipse behave more like certain other popular |
| IDEs. On the minus side, it does mean that in-memory workspace resource tree is |
| not quite as faithful a mirror of the file system.</p> |
| <p><b>Option S-5</b>: Add Eclipse Platform mechanism to hide certain files in the workspace resource |
| tree.</p> |
| <p> Eclipse Platform 2.0 has a "team private member" mechanism for |
| hiding certain resources. These resources are represented by entries in the |
| workspace resource tree, but are explicitly marked as hidden so that clients |
| will not see these resources unless they ask to see them. Imagine that this |
| mechanism was generalized and extended so that other resources could be |
| similarly hidden from clients that do not ask for them. By default, there would be no |
| hidden files, |
| and the workspace would behave exactly as in 2.0. The refresh operation would |
| automatically add and remove files as in 2.0. The user could explicitly control |
| whether they were marked as hidden, and whether hidden files were shown in the |
| UI. This would give workspace projects an all-inclusive feel |
| which the user |
| could make more selective as required.</p> |
| <p>New API would be required to change the hidden flag and to include or exclude |
| hidden resources when navigating the workspace. The semantics of IResource.refreshLocal would not have to change. A project's workspace |
| resource tree is a more-or-less faithful mirror of the project's subtree in the |
| file system except for the files and folders that the user has explicitly taken |
| off the table.</p> |
| <h3>Assessment </h3> |
| <ul> |
| <li>S-1 is promising.</li> |
| <li>S-2 is also promising; it provides less flexibility that S-1, but is also |
| simpler all around.</li> |
| <li>S-3 is a non-starter.</li> |
| <li>S-4 is promising.</li> |
| <li>S-5 is promising.</li> |
| </ul> |
| <h2>Allowing Overlap</h2> |
| <p>How could we change Eclipse to allow Java source folders to overlap?</p> |
| <p>Here are some options (in no particular order):</p> |
| <p><b>Option V-1</b>: Change JDT to allow overlap within a project's source |
| folders.</p> |
| <p>This option is discussed in S-1 and S-2.</p> |
| <p><b>Option V-2</b>: Allow "mounted" file system directories to |
| overlap.</p> |
| <p>One of the design details of option M-2 is whether to allow mounted |
| directories to overlap, either within a single project or across all projects in |
| the workspace. </p> |
| <p> The simple interpretation of overlapping mount points would mean that the same file on |
| disk might have multiple distinct resource handles. This would create a semantic |
| problem for the IWorkspaceRoot.getContainer/FileForLocation API methods which |
| presuppose that there is at most one resource handle for any candidate file system path.</p> |
| <p>Other issues if two resources /P1/Foo.txt and /P2/Foo.txt correspond to the |
| same file C:/Sources/Foo.txt:</p> |
| <ul> |
| <li>Refresh: Does refreshing one resource also refresh the other?</li> |
| <li>VCM: How to decide which project is responsible for VCM?</li> |
| </ul> |
| <h3>Assessment </h3> |
| <ul> |
| <li>V-1 is promising.</li> |
| <li>V-2 is promising, but has some API breakage, and some semantic questions |
| that need to be worked through.</li> |
| </ul> |
| <p>Options V-1 and V-2 are not necessarily mutually exclusive. There may be reason to allow overlapping source folders regardless of mount points, and vice-versa.</p> |
| </body> |
| </html> |