This file is indexed.

/usr/share/psychtoolbox-3/PsychJava/PsychJavaTrouble.m is in psychtoolbox-3-common 3.0.11.20140816.dfsg1-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
function PsychJavaTrouble(installStatic)
% PsychJavaTrouble -- What to do if Java-based Psychtoolbox functions fail?
%
% You probably arrived at this help text because of an error in execution
% of one of the Psychtoolbox Java based functions, e.g., ListenChar,
% CharAvail, GetChar or FlushEvents.
%
% There are four common reasons for failure of Java based Psychtoolbox
% functions:
%
% 1. You run Matlab in nojvm mode, i.e., you started Matlab via 'matlab
% -nojvm'. In that case, Matlabs Java virtual machine is disabled and so
% are all Java based Psychtoolbox functions. In that case you need to
% restart Matlab with its Java VM enabled.
%
% 2. You run GNU/Octave, which doesn't support our Java based keyboard
% functions. However, then you should not ever end here, as we use an
% alternate implementation on Octave.
%
% 3. The Psychtoolbox/PsychJava/ subfolder of your working copy of
% Psychtoolbox isn't included in Matlabs static Java classpath. The
% Psychtoolbox installer/upgrader (DownloadPsychtoolbox, SetupPsychtoolbox
% or UpdatePsychtoolbox, as well as DownloadAdditionsForLinux) usually
% tries to edit the 'classpath.txt' file, or since Matlab 8.1,
% 'javaclasspath.txt', of your Matlab installation in order to add the
% Psychtoolbox/PsychJava subfolder to Matlabs classpath. This procedure may
% fail due to insufficient access permissions on your system. You can
% verify this by entering 'type classpath.txt' at the Matlab prompt. The
% printed file should contain the path to the PsychJava folder. If it
% doesn't, you may want to edit the file yourself ('which classpath.txt'
% tells you the location of the file) or ask a system administrator to do
% it for you. After editing the file you need to restart Matlab. Instead of
% manual editing you can also call this function as PsychJavaTrouble(1); -
% This will try to automatically modify the classpath.txt or
% javaclasspath.txt file if your Matlab runs with sufficient permissions,
% e.g., administrator permissions.
%
% If you need a quick temporary fix for the problem, other than editing
% classpath.txt and restarting Matlab, then type 'PsychJavaTrouble' at the
% Matlab command prompt. The function will add the PsychJava folder to the
% dynamic classpath to immediately enable Java based Psychtoolbox
% functions. This fix is temporary however, it needs to be repeated after
% each restart of Matlab. Executing the command will also clear all
% variables and functions from Matlabs workspace (like 'clear all'), so
% adding it to experiment scripts may impair proper working of that
% scripts.
%
% 4. You didn't restart Matlab after the Psychtoolbox installer asked you
% to do so. -> Restart Matlab and retry.
%
% 5. The versions of GetCharJava bundled with Psychtoolbox are incompatible
% with the version of Java installed on your machine or bundled with your
% version of Matlab. If you have a Java SDK installed on your machine,
% Psychtoolbox will try to compile a matching version of GetCharJava. This
% should succeed on OS-X but is unlikely to work on Windows, because that
% system does not have a javac compiler installed by default.
%
% 6. Other reasons: Post to the Psychtoolbox forum and ask for help.
%
% Good luck!

% History:
% 20.09.2006 Written (MK)
% 13.05.2013 Add Matlab static classpath setup code as helper for routines
%            like PsychtoolboxPostInstallRoutine.m (MK)

% Only fix class path dynamically by default:
if nargin < 1 || isempty(installStatic)
    installStatic = 0;
end

% Dynamic fix requested, aka installStatic is 0 / false?
if ~installStatic
    % Yes:
    if IsOctave
        error('Running on GNU/Octave: Java is not supported on that system. Sorry!');
    end
    
    if ~exist('javaaddpath') %#ok<EXIST>
        error('Your version of Matlab does not support dynamic Java class path. Sorry!');
    end
    
    try
        fprintf('PsychJavaTrouble: Will now try to add the PsychJava folder to Matlabs dynamic classpath...\n');
        javapath = [PsychtoolboxRoot 'PsychJava'];
        javaaddpath(javapath);
        fprintf('PsychJavaTrouble: Added PsychJava folder to dynamic class path. Psychtoolbox Java commands should work now!\n');
        return;
    catch %#ok<CTCH>
        psychrethrow(psychlasterror);
        error('Failed to add PsychJava to classpath for unknown reason!');
    end
    
    return;
end

% If we reach this point, then we're asked to update the static classpath
% file, just as it would happen during PTB updates and installation:
% If we're using Matlab then add the PsychJava stuff to the static
% Java classpath.
if ~IsOctave
    try
        % Figure out the PsychJava path we need to add to the static Java
        % classpath.
        path_PsychJava = [PsychtoolboxRoot, 'PsychJava'];
        
        % Matlab 8.1 changes the rules about static java classpath. Lovely.
        if verLessThan('matlab', '8.1')
            % Legacy: Open up the classpath.txt file and find any PsychJava
            % entries.  If they exist, remove them, and put the current one
            % in the file.  This only allows on PsychJava to be on the
            % path.
            classpathFile = which('classpath.txt');
        else
            % Matlab version 8.1 (R2013a) or later. classpath.txt can't be
            % used anymore. Now they want us to store static classpath
            % definitions in a file called javaclasspath.txt inside the
            % Matlab preference folder:
            
            % Try to find the file, if it already exists, e.g., inside the
            % Matlab startup folder:
            classpathFile = which('javaclasspath.txt');
            
            % Found it?
            if isempty(classpathFile)
                % Nope. So we try the preference folder.
                % Retrieve path to preference folder. Create the folder if it
                % doesn't already exist:
                prefFolder = prefdir(1);
                classpathFile = [prefFolder filesep 'javaclasspath.txt'];
                if ~exist(classpathFile, 'file')
                    fid = fopen(classpathFile, 'w');
                    fclose(fid);
                end
            end
        end
        
        % Define name of backup file:
        bakclasspathFile = [classpathFile '.bak'];
        
        if ~verLessThan('matlab', '7.14')
            % New style method: (textread() is deprecated as of at least R2012a)
            fid = fopen(classpathFile);
            fileContentsWrapped = textscan(fid, '%s', 'delimiter', '\n');
            fclose(fid);
            fileContents = fileContentsWrapped{1};
        else
            fileContents = textread(classpathFile, '%s', 'delimiter', '\n'); %#ok<REMFF1>
        end
        
        j = 1;
        newFileContents = {};
        pathInserted = 0;
        for i = 1:length(fileContents)
            % Look for the first instance of PsychJava in the classpath and
            % replace it with the new one.  All other instances will be
            % ignored.
            if isempty(strfind('PsychJava', fileContents{i}))
                newFileContents{j, 1} = fileContents{i}; %#ok<AGROW>
                j = j + 1;
            elseif ~isempty(strfind('PsychJava', fileContents{i})) && ~pathInserted
                newFileContents{j, 1} = path_PsychJava; %#ok<AGROW>
                pathInserted = 1;
                j = j + 1;
            end
        end
        
        % If the PsychJava path wasn't inserted, then this must be a new
        % installation, so we append it to the classpath.
        if ~pathInserted
            newFileContents{end + 1, 1} = path_PsychJava;
        end
        
        % Now compare to see if the new and old classpath are the same.  If
        % they are, then there's no need to do anything.
        updateClasspath = 1;
        if length(fileContents) == length(newFileContents)
            if strcmp(fileContents, newFileContents)
                updateClasspath = 0;
            end
        end
        
        if updateClasspath
            % Make a backup of the old classpath.
            clear madeBackup;
            
            [s, w] = copyfile(classpathFile, bakclasspathFile, 'f');
            
            if s==0
                error(['Could not make a backup copy of Matlab''s JAVA path definition file.\n' ...
                    'The system reports: ', w]);
            end
            madeBackup = 1; %#ok<NASGU>
            
            % Write out the new contents.
            FID = fopen(classpathFile, 'w');
            if FID == -1
                error('Could not open Matlab''s JAVA path definition file for write access.');
            end
            for i = 1:length(newFileContents)
                fprintf(FID, '%s\n', newFileContents{i});
            end
            fclose(FID);
            
            fprintf('\n\n');
            disp('*** Matlab''s Static Java classpath definition file modified. You will have to restart Matlab to enable use of the new Java components. ***');
            fprintf('\nPress RETURN or ENTER to confirm you read and understood the above message.\n');
            pause;
        end
    catch %#ok<CTCH>
        lerr = psychlasterror;
        fprintf('Could not update the Matlab JAVA classpath file due to the following error:\n');
        fprintf('%s\n\n', lerr.message);
        fprintf('Either you have a very old Matlab version which does not support JAVA or, most\n');
        fprintf('likely, you do not have sufficient access permissions for the Matlab application folder\n');
        fprintf('or file itself to change the file %s .\n', classpathFile);
        fprintf('Please ask the system administrator to enable write-access to that file and its\n');
        fprintf('containing folder and then repeat the update procedure.\n');
        fprintf('Alternatively, ask the administrator to add the following line:\n');
        fprintf('%s\n', path_PsychJava);
        fprintf('to the file: %s\n\n', classpathFile);
        fprintf('If you skip this step, Psychtoolbox will still be mostly functional, \n');
        fprintf('but the Java-based commands ListenChar, CharAvail, GetChar and FlushEvents\n');
        fprintf('on Linux, MacOS-X and M$-Windows in Java mode will work less efficiently.\n');
        fprintf('For more info see ''help PsychJavaTrouble''.\n\n');
        fprintf('\nPress RETURN or ENTER to confirm you read and understood the above message.\n');
        pause;
        
        % Restore the old classpath file if necessary.
        if exist('madeBackup', 'var')
            [s, w] = copyfile(bakclasspathFile, classpathFile, 'f'); %#ok<NASGU,ASGLU>
        end
    end
end % if ~IsOctave