| <!-- 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> |