1   package org.apache.maven.plugin.eclipse;
2   
3   import java.io.DataOutputStream;
4   import java.io.File;
5   import java.io.FileInputStream;
6   import java.io.FileNotFoundException;
7   import java.io.FileOutputStream;
8   import java.io.IOException;
9   import java.util.Properties;
10  
11  import org.eclipse.core.internal.localstore.ILocalStoreConstants;
12  
13  public class TempEclipseWorkspace
14  {
15  
16      File workspaceLocation;
17  
18      public TempEclipseWorkspace( String testWorkspaceName, boolean usePathToProject )
19          throws Exception
20      {
21  
22          File eclipseLocation = new java.io.File( "target/test-classes/eclipse" ).getCanonicalFile();
23  
24          File jdkLocation = new File( eclipseLocation, "dummyJDK" );
25  
26          workspaceLocation = new File( eclipseLocation, testWorkspaceName + "/workspace" ).getCanonicalFile();
27  
28          File localizedIndicator = new File( workspaceLocation, ".localized" );
29          if ( !localizedIndicator.exists() )
30          {
31              File propertyfile =
32                  new File( workspaceLocation,
33                            ".metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.launching.prefs" );
34  
35              preparePropertyFile( jdkLocation, propertyfile );
36  
37              String projectLocation;
38              if ( usePathToProject )
39              {
40                  projectLocation = "URI//file:" + ( new File( workspaceLocation, "direct-compile" ).getCanonicalPath() );
41              }
42              else
43              {
44                  projectLocation = "";
45              }
46              FileOutputStream location =
47                  new FileOutputStream(
48                                        new File( workspaceLocation,
49                                                  ".metadata/.plugins/org.eclipse.core.resources/.projects/direct-compile/.location" ) );
50              DataOutputStream dataOutputStream = new DataOutputStream( location );
51              dataOutputStream.write( ILocalStoreConstants.BEGIN_CHUNK );
52              dataOutputStream.writeUTF( projectLocation );
53              dataOutputStream.write( ILocalStoreConstants.END_CHUNK );
54              dataOutputStream.close();
55              location.close();
56              localizedIndicator.createNewFile();
57          }
58  
59      }
60  
61      private static void preparePropertyFile( File jdkLocation, File propertyfile )
62          throws IOException, FileNotFoundException
63      {
64          Properties properties = new Properties();
65          properties.load( new FileInputStream( propertyfile ) );
66          properties.setProperty(
67                                  "org.eclipse.jdt.launching.PREF_VM_XML",
68                                  properties.getProperty( "org.eclipse.jdt.launching.PREF_VM_XML" ).replaceAll(
69                                                                                                                "__replace_with_test_dir__",
70                                                                                                                jdkLocation.getCanonicalPath().replace(
71                                                                                                                                                        '\\',
72                                                                                                                                                        '/' ) ) );
73          properties.store( new FileOutputStream( propertyfile ), "" );
74      }
75  
76      public File getWorkspaceLocation()
77      {
78          return workspaceLocation;
79      }
80  }