 ------
 Importing Projects
 ------
 ------
 26 Feb 2009
 ------

Importing Projects

  This section provides procedures on importing a Visual Studio project using Generate Solution's POM Information... feature.
  This feature will generate <<<pom.xml>>> files from an existing Visual Studio solution file. The generated <<<pom.xml>>>
  file will contain the latest versions of the artifact dependencies used for the project.
  
  <<Note>>: ASP.NET MVC should be installed to get the proper behavior when importing projects especially those projects
  with unsupported project types. (Refer to {{{../installation/index.html} Pre-requisites}} section.)
  
  [[1]] Right click on the project and select the Generate Solution's POM Information...\
  .

[../images/import.jpg]

  [[2]] In the pop-up screen, Browse to the directory location of the parent solution file to use. Group Id is generated by default
  with the format of <<<[company_id].[solution_name]>>>.\
  .

[../images/import_screen.jpg] Importing parent solution file

  [[3]] Click Generate POMs.
  
  Underscores and spaces in artifact's groupId are automatically deleted when added to the project's <<<pom.xml>>>.
  The table below shows the conversion of certain values of groupIds.

*--------------------+--------------------+
| <<Artifact Group Id>>  | <<Converted Group Id>> |
*--------------------+--------------------+
|The.Project         |The.Project         |
*--------------------+--------------------+
|the.project         |the.project         |
*--------------------+--------------------+
|the project         |TheProject          |
*--------------------+--------------------+
|the_project         |TheProject          |
*--------------------+--------------------+

  [[4]] From the Project Units Tests window, select the test modules to be used for the project and click OK.\
  .

[../images/unit_test.jpg] Project unit tests list

  <<<pom.xml>>> files will be generated for all the projects that are included in the solution file: the parent project and its sub-projects,
  if there are any.
  
  <<Note>>: The Units Tests window is not displayed when importing unsupported project types. Hence, an unsupported project type warning is displayed.
  For multi-module projects with supported and/or unsupported project types, the supported projects are included in the parent pom while
  for the unsupported project types, these are not included in the parent pom, and a warning is displayed.
  
  For projects with web references, the <<<pom.xml>>> generated will contain <<<maven-wsdl-plugin>>> configuration similar to the following:

+------+
  <plugin>
    <groupId>npanday.plugin</groupId>
    <artifactId>maven-wsdl-plugin</artifactId>
    <extensions>true</extensions>
    <executions>
      <execution>
        <goals>
          <goal>wsdl</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <webreferences>
        <webreference>
          <namespace>AnotherWebService</namespace>
          <path>Web References/AnotherWebService/AnotherWS.wsdl</path>
          <output>Web References/AnotherWebService/</output>
        </webreference>
      </webreferences>
    </configuration>
  </plugin>
+------+

  The wsdl goal is the one responsible for building and creating webservice proxy classes. And, all the web references used in the project
  are listed inside the <<< \<webreferences\> >>> tag. For more instructions on adding, renaming, and deleting web references,
  refer to {{{references.html} Web References}} section of this document.
  
  []
  
* Importing Projects with Resource File

  If the project you are importing includes a resource file, the <<<maven-resgen>>> plugin is added to <<<pom.xml>>> during import.
  
  In the plugin's configuration, you can find the list of resource (<<<resx>>>) files with corresponding names.
  By default, <<<RootNamespace>>> is the assembly name and <<<RootNamespace.Filename>>> is the filename of the <<<resx>>> files.
  To ensure that the plugin works, the following are required:
  
  * The classname and the filename of the item that contains the resx files must have the same name. Example:
  
  <<<"public class frmMaestroName" = frmMaestroName.resx = frmMaestroName.cs>>>
  
  <<Note>>: Changing the codefile(.cs/.vb) automatically updates the resource(resx) file. In some instances, however, this does not hold true.
  
  * The namespace of the project should be equal to the DefaultNamespace of the project assembly. To check the default name,
  
    * Right-click on the project and select Properties. This displays a project property window.
    
    * Select the Application tab.
    
    * In the DefaultNamespace field, you will find <<<RootNamespace>>>.
    
    []
    
  []
  
  Once the above requirements are met, the importer automatically does the work and there is no need to edit <<<pom.xml>>>.
  
  Removing the configuration part of the <<<maven-resgen>>> plugin allows the plugin to locate all the resx files and compile them
  as <<<ArtifactId.Filename>>>. If you set the namespace as the artifactId, you do not need to list all the resx files in the <<<pom.xml>>>.
  
  <<Note>>: This feature does not support cultured esx files such as <<<eu-US>>>, <<<it>>>, <<<jp>>>, <<<de>>>, <<<eu-UK>>>, and even custom culture.
  
