Author: YOUR NAME HERE
Keywords: SOME KEYWORDS

# JMRI: Profile Directory Tutorial

This page is a tutorial on how JMRI stores and accesses preference and profile information.

## Locations and contents

Settings Location (portable name = "settings:")
  This is the only fixed location and is determined by the underlying operating system type and your logged-in-username. It's a known place the JMRI program can always look and find essential settings files that tell it where everything else is located.

  The following files/folders are always located here:

  nodeIdentity.xml
    This file contains a unique nodeIdentity string that is generated the first time JMRI uses this Settings Location, doesn't change and serves to distinguish between other possible Settings Locations (such as under another username, on a different operating system partition or another computer).
  profiles.xml
    This file lists the name of every Profile Folder known to this instance of JMRI and its location. It also has a list of all paths you wish to search for profiles and which path is the default for newly-created profiles. "settings:" is always searched but it doesn't have to be the default.
  preferences
    This directory contains preferences that are retained on the computer for use in all JMRI application profiles. If it is not present, no preferences that apply to all profiles have been written.
  log
    This folder contains the "session.log" and "messages.log" files, plus several previous versions of these files.
  DecoderProConfig3.properties
  PanelProConfig2.properties
  SoundProConfig2.properties
  LccProConfig.properties
    These files are created the first time each of the apps are run and simply contain three pieces of information:
    - The name of the Profile Folder last used by this app.
    - Whether you want the app to autostart with the last-used Profile Folder
    - How long to display the Profile Selector box if you choose not to autostart.
  Other files/folders:
    The following may be present, but do not have to be:
    - Various Profile Folders you have created. From V4.13.4 on, newly-created Profile Folders will have a ".jmri" extension.
    - Your User Files - panels etc.
    - Your "roster" folder and its (recreatable) roster.xml file.
Profile Location (portable name = "profile:")
  This folder is the one chosen by the Profile Selector mechanism for the current JMRI session.

  The "profile" folder at the profile: location contains the "profile.xml" and "profile.properties" files and one or more node specific folders that start with "jmri-".

  The node specific folders contain local versions of "profile.xml", "profile.properties" and "user-interface.xml". The "user-interface.xml" file contains information on window size and positions, column widths, etc.

  Other files/folders:

  - Other specific preference folders (throttle, etc.)
  The following may be present, but do not have to be:
  - Your User Files - panels etc.
  - Your "roster" folder and its (recreatable) roster.xml file.
User Files Location (portable name = "preference:")
  This location contains:
  - Your User Files - panels etc.
  The following may be present, but does not have to be:
  - Your "roster" folder and its (recreatable) roster.xml file.

  You are free to change the User Files Location as you like (Preferences->File Locations).

Roster Location
  This location contains:
  - A "roster.xml" file, which is a (recreatable) index of the XML files in the "roster" folder. You should create/recreate "roster.xml" (Actions->Recreate Roster Index) if it is missing or you are experiencing roster problems.
  - Your "roster" folder. This contains:
    - An XML file for each loco entry in your roster, with stored CV values, etc.
    - ".bak" files, which are backup versions of entries in your roster.
    - A "consist" folder, which stores information on consists you have created using the Consist tools in JMRI.
    - Copies of media files you have added to roster entries, throttles etc.
      (Older JMRI versions stored roster images in a "resources" folder in the User Files Location. If you have been using JMRI for a long time, you may have roster images in both locations.)

  By default the Roster Location is the same as (and follows) the User Files location unless you explicitly set a different location.

  You are free to change the Roster Location as you like (Preferences->Roster->Roster->Location Set/Reset). The Reset button causes the Roster Location to again follow the User Files location.

Scripts Location (portable name = "scripts:")
  This location defaults to the "jython" sample scripts folder located within your JMRI Program Location. You should never store user-created files anywhere within your Program Location, they are likely to be lost in a JMRI upgrade.

  If you are creating your own scripts you may wish to change the Scripts Location (Preferences->File Locations).

Program Location (portable name = "program:")
  This location is set when JMRI is installed and can only be changed when installing the software. You should never store user-created files anywhere within your Program Location, they are likely to be lost in a JMRI upgrade.

## User Files Location defaults and implications

Depending when you first installed JMRI on your computer, the default User Files Location will differ:

- Before the advent of Profiles (JMRI V3.8),the default User Files Location was the same as the Settings. This arrangement stayed in place with the upgrade.
- After the implementation of Profiles (JMRI V3.8),the default User Files Location for new installations is the same as the Profile Location.

### Implications of User Files Location with Profiles

- If you create a new profile, User Files Location = Profile Location. This means the profile will have an initially-empty set of User Files.
- If you create a copy of a profile that has User Files Location within the Profile Location, the new profile will have a new private copy of User Files from the source profile. The two sets will be unconnected and changes to one will not affect the other.
- If you create a copy of a profile that has User Files Location anywhere on the computer outside the Profile Location, the new profile will share User Files with the source profile. So changes will be seen by both profiles.

### Implications of Separating User Files Location and Roster Location

If you separate User Files Location from Roster Location (as documented above), you can implement differing sharing/separation of the two, e.g a single roster shared between two different layouts (each with its own profile).

### Sharing User Files between Computers

Since User Files can be relocated completely outside of the user's JMRI file system, sharing of User Files between computers is easy:

#### Use of simple file sharing or using a local NAS or other file server

This approach seems appealing at first sight. However there are considerable disadvantages and risks.

- The host computer or server must always be on line when using JMRI on any computer.
- Use of JMRI on a laptop away from home or Internet access will not be possible.
- JMRI is not designed for simultaneous file access. The risk of file corruption is very high.
- Recovery from a file corruption may be difficult or impossible unless a very comprehensive incremental backup strategy is in use and even the there is likely to be some data loss.

See the link below for further information on issues with simple file sharing:

#### Use of a cloud-synced sharing solution

Note that in this context we are not talking about a Cloud Server approach where your files only exist on a remote server. We are talking about a service such as Dropbox, Google Drive, OneDrive where full local copies exist on each computer and each copy is kept in sync with the central Cloud copy.

There are considerable advantages with this approach.

- Only one computer needs to be switched on at a time.
- Use of JMRI on a laptop away from home or Internet access is fine. The file changes will be synced next time you are connected.
- These services generally do not usually use simultaneous file access. The risk of file corruption is much lower.
- Recovery from unintended file changes is much easier. For example Dropbox keeps every saved change you have made in the past 30 days (even if you only have one computer) and allows easy reversion.

We tend to talk about Dropbox because that is the one that seems to be most used by JMRI developers and users, some of whom have been doing so for many years. For more information and setup instructions (also applicable to competing services) see the JMRI page on Dropbox use.

### Sharing Profiles between Computers

In the same way that User Files can be relocated completely outside of the user's JMRI file system and shared between computers, so can entire Profiles. In Preferences->Config Profiles->Search Paths you can add a search path in a synced/shared location and set that to be the default for newly-created profiles. It's then simply a matter of manually moving each Profile Folder from the Settings Location to your new shared folder. When you first use a shared profile on a different computer JMRI creates a node-specific folder for storing overrides of settings (see above) that are machine-specific (e.g. COM port names).

I have been using both of shared User Files (a "JMRI" folder in my Dropbox folder) for many years and a shared Profiles (a "JMRI Config Profiles" folder in my Dropbox folder) for more than a year now (and tweaked some JMRI code to improve node differentiation) across more than a dozen machines/virtual machines, running Mac, Windows and Linux.

## Portable File Access in JMRI

The success of file and profile sharing in JMRI is very dependent on the use of our Portable File Access specification in XML files.

Briefly, this consists of pseudo-URL prefixes (portable names mentioned above) that replace machine-specific directory paths in file specifications with a set of prefixes relative to known JMRI and machine locations. These are expanded by the local JMRI instance to create a machine-specific file specification. The component separators are standardised as "/" and converted locally.

For more information see the FileNames page. For a full list of prefixes, see the JavaDocs for the FileUtil class.