Bug 3345

Summary: rpm for ImageJ
Product: Mageia Reporter: JeanClaude Colette <colette.jc>
Component: New RPM package requestAssignee: Mageia Bug Squad <bugsquad>
Status: RESOLVED DUPLICATE QA Contact:
Severity: enhancement    
Priority: Normal CC: zen25000
Version: Cauldron   
Target Milestone: ---   
Hardware: i586   
OS: Linux   
URL: http://rsb.info.nih.gov/ij/index.html
Whiteboard:
Source RPM: imagej CVE:
Status comment:
Attachments: spec file for imagej
imagej.sh

Description JeanClaude Colette 2011-11-15 10:28:08 CET
There is no rpm package for ImageJ.

I send you the spec file that I have updated and the file imagej.sh which must be placed in the SOURCES directory

------------------------------------------------------------
Name:           imagej
Version:        1.46a
Release:        %mkrel 1
Summary:        Image Processing and Analysis in Java

Group:          Applications/Engineering
License:        Public Domain
URL:            http://rsb.info.nih.gov/ij/index.html
Source0:        http://rsb.info.nih.gov/ij/download/src/ij146a-src.zip
# unix-script.txt modified for linux
Source1:        imagej.sh
Source2:        http://rsb.info.nih.gov/ij/macros/macros.zip
Source3:        http://rsb.info.nih.gov/ij/download/linux/unix-script.txt

BuildArch:      noarch
BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}


BuildRequires:  jpackage-utils
BuildRequires:  java-devel
BuildRequires:  ant
BuildRequires:  desktop-file-utils


Requires:       jpackage-utils
# java-devel not java for plugins build
Requires:       java-1.6.0-devel >= 1.6.0

%description
ImageJ is a public domain Java image processing program. It can display,        
edit, analyze a wide variety of image data, including image sequences. Imagej   
can be used for quantitative analysis of engineering and scientific image data.

%description -l fr.UTF-8
ImageJ est un logiciel de retouche d'images, du domaine public. Il permet d'afficher,
de modifier, d'analyser une très grande variété d'images, incluant les
séquences d'images. ImageJ peut être utilisé pour effectuer des analyses quantitatives
d'images.

%package javadoc
Summary:        Javadocs for %{name}
Group:          Documentation
BuildArch:      noarch
Requires:       %{name} = %{version}-%{release}
Requires:       jpackage-utils

%description javadoc
This package contains the API documentation for %{name}.
%description javadoc -l fr.UTF-8
Ce paquet contient la documentation de l'API pour %{name}.

%prep
%setup -q -c -n "%{name}-%{version}" 
unzip -qq -u %{SOURCE2}
# erase binary and useless files 
rm -rf macros/.FBC*
rm macros/build.xml
rm -rf __MACOSX

find -name '/*.class' -exec rm -f '{}' \;
find -name '*.jar' -exec rm -f '{}' \;

%build
cd source
ant build javadocs
cd ..

%install
rm -rf $RPM_BUILD_ROOT

# install jar
mkdir -p $RPM_BUILD_ROOT%{_javadir}
cp -p source/ij.jar   \
$RPM_BUILD_ROOT%{_javadir}/%{name}-%{version}.jar
ln -s %{name}-%{version}.jar $RPM_BUILD_ROOT%{_javadir}/%{name}.jar

# install javadoc
mkdir -p $RPM_BUILD_ROOT%{_javadocdir}/%{name}
cp -rp api  \
$RPM_BUILD_ROOT%{_javadocdir}/%{name}

#install icons
mkdir -p $RPM_BUILD_ROOT%{_datadir}/pixmaps
cat > $RPM_BUILD_ROOT%{_datadir}/pixmaps/imagej.xpm << EOF
/* XPM */
static char *imagej[] = {
/* columns rows colors chars-per-pixel */
"20 20 8 1 ",
"  c #C3D100",
". c #D1C700",
"X c #D1B500",
"o c #D1A900",
"O c #CB8E00",
"+ c #C57700",
"@ c None",
"# c black",
/* pixels */
"@@@@@@@@@@++@@@@@@@@",
"@@@@@@@@@@+ @@@@@@@@",
"@@@@@@@@@@+ @@@@@@@@",
"@@@@@@@@@@+ @@@@@@@@",
"@@@@@@@@@@+O@@@@@@@@",
"@@@@@@@@@@+O@@@@@@@@",
"@@@@@@@@@o+O@@@@@@@@",
"@@@@@@@@O++O@@@@@@@@",
"@@@@@@@++++O@@@@@@@@",
"@@@@@@O+@@+O@@@@@@@@",
"@@@@@@++@@++@@@@@@@@",
"@@@@@@++@@++@@@@@@@@",
"@@@@@@++@@@@@@@@@@@@",
"@@@@@@++++OXX  @@@@@",
"@@@@@@@+++OOOO@@@@@@",
"@@@@@@@@++@@@@@@@@@@",
"@@@@@@@@++@.@@@@@@@@",
"@@@@@@@@++@OO@@@@@@@",
"@@@@@+++XXXXX  @@@@@",
"@@@@++++++++OO. @@@@"
};
EOF


# Install desktop file
mkdir -p $RPM_BUILD_ROOT%{_datadir}/applications
cat > $RPM_BUILD_ROOT%{_datadir}/applications/imagej.desktop << EOF
[Desktop Entry]
Encoding=UTF-8
Name=ImageJ
GenericName=Image Editor                                       
GenericName[ar]=ÙØ­Ø±Ø± ØµÙØ±                                       
GenericName[be]=РÑдакÑÐ°Ñ Ð²ÑдаÑÑÑÐ°Ñ                             
GenericName[bg]=РедакÑÐ¾Ñ Ð½Ð° изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ                        
GenericName[ca]=Editor d'imatges                               
GenericName[ca@valencia]=Editor d'imatges                      
GenericName[cs]=Editor obrázků                                 
GenericName[da]=Billedredigering                               
GenericName[de]=Bildeditor                                     
GenericName[dz]=à½à½à½à½¦à¼à½à½¢à½à¼ à½à½à¼à½à½à¼à½à¼                             
GenericName[el]=ÎÏεξεÏγαÏÏÎ®Ï ÎµÎ¹ÎºÏνÏν                           
GenericName[en_CA]=Image Editor                                
GenericName[en_GB]=Image Editor                                
GenericName[eo]=Bilada Redaktilo                               
GenericName[es]=Editor de imagen                               
GenericName[et]=Pildiredaktor                                  
GenericName[eu]=Irudi-editorea                                 
GenericName[fa]=ÙÛØ±Ø§Ûشگر تصÙÛØ±                                 
GenericName[fi]=Kuvankäsittely                                 
GenericName[fr]=Ãditeur d'image                                
GenericName[gl]=Editor de imaxes                               
GenericName[gu]=àªàª¿àª¤àª° સપાદઠ                                    
GenericName[hu]=KépszerkesztÅ                                  
GenericName[is]=Myndvinnsluforrit                              
GenericName[it]=Editor immagine                                
GenericName[ja]=ç»åã¨ãã£ã¿                                   
GenericName[ka]=ááááá¡áá®á£ááááááá¡ á áááá¥á¢áá á                      
GenericName[km]=ááááááááááááá¶á                                 
GenericName[kn]=à²à²¤à²° ಸà²à²ªà²¾à²¦à²                                     
GenericName[ko]=ì´ë¯¸ì§ í¸ì§ê¸°                                  
GenericName[lt]=PaveikslÄlių rengyklÄ                          
GenericName[lv]=AttÄla redaktors                               
GenericName[mk]=УÑедник за Ñлики                               
GenericName[mr]=परतिमा सपादठ                                  
GenericName[nb]=Bildebehandler                                 
GenericName[ne]=à¤à¤µà¤¿ समपादठ                                    
GenericName[nl]=Afbeeldingsbewerker                            
GenericName[nn]=Biletbehandlar                                 
GenericName[or]=ପରତà¬à¬¬ ସମପାଦଠ                                  
GenericName[pa]=à¨à¨¿à¨¤à¨° à¨à¨¡à©à¨à¨°                                     
GenericName[pl]=Edytor obrazu                                  
GenericName[pt]=Editor de Imagens                              
GenericName[pt_BR]=Editor de Imagens                           
GenericName[ro]=Editor de imagine                              
GenericName[ru]=РедакÑÐ¾Ñ Ð¸Ð·Ð¾Ð±Ñажений                           
GenericName[sk]=Editor obrázkov                                
GenericName[sl]=Urejevalnik slik                               
GenericName[sr]=ÐбÑада Ñлика                                   
GenericName[sr@latin]=Obrada slika                             
GenericName[sv]=Bildredigerare                                 
GenericName[ta]=பிமப திரà¯à®¤à®¤à®¿                                   
GenericName[th]=à¸à¸§à¹à¸à¹à¸à¸ à¸²à¸                                      
GenericName[tr]=Resim Düzenleyici                              
GenericName[tt]=Sürät Tözätkeç                                 
GenericName[uk]=РедакÑÐ¾Ñ Ð·Ð¾Ð±ÑÐ°Ð¶ÐµÐ½Ñ                             
GenericName[vi]=BỠbiên soạn ảnh                               
GenericName[xh]=UmHleli woMfanekiso                            
GenericName[zh_CN]=å¾åç¼è¾å¨                                  
GenericName[zh_HK]=åçç·¨è¼¯å¨                                  
GenericName[zh_TW]=åçç·¨è¼¯å¨    
Comment=Image Processing and Analysis in Java
Comment[fr_FR]=en Java
Exec=imagej %f
TryExec=imagej 
Icon=/usr/share/pixmaps/imagej.xpm
Terminal=false
Type=Application
Categories=Java;Graphics;
MimeType=image/bmp;image/gif;image/jpeg;image/jpg;image/pjeg;image/png;image/tiff;image/x-bmp;image/x-fits;image/x-png;image/x-psd;image/x-xbitmap;application/dicom;
EOF


# install data files
mkdir -p $RPM_BUILD_ROOT%{_datadir}/%{name}
cp -p source/build/about.jpg $RPM_BUILD_ROOT%{_datadir}/%{name}/about.jpg
cp -p source/build/IJ_Props.txt $RPM_BUILD_ROOT%{_datadir}/%{name}/IJ_Props.txt

#install macros
chmod 644 macros/About\ Startup\ Macros 
find ./macros -name \*.txt -type f -exec chmod 644 {} \;
find ./macros -type d -exec chmod 755 {} \;
cp -rp macros $RPM_BUILD_ROOT%{_datadir}/%{name}


#install luts
mkdir $RPM_BUILD_ROOT%{_datadir}/%{name}/luts 

# install script
mkdir -p $RPM_BUILD_ROOT%{_bindir}
cp -p %{SOURCE1} $RPM_BUILD_ROOT%{_bindir}/%{name}
chmod +x $RPM_BUILD_ROOT%{_bindir}/%{name}

# directory for plugins
mkdir -p $RPM_BUILD_ROOT%{_datadir}/%{name}/plugins
cp source/plugins/JavaScriptEvaluator.source $RPM_BUILD_ROOT%{_datadir}/%{name}/plugins/JavaScriptEvaluator.java

%post

#update icon cache
touch --no-create %{_datadir}/icons/hicolor
if [ -x %{_bindir}/gtk-update-icon-cache ]; then
  %{_bindir}/gtk-update-icon-cache -q %{_datadir}/icons/hicolor;
fi
update-desktop-database &> /dev/null || :

%postun
# update icon cache
touch --no-create %{_datadir}/icons/hicolor
if [ -x %{_bindir}/gtk-update-icon-cache ]; then
  %{_bindir}/gtk-update-icon-cache -q %{_datadir}/icons/hicolor;
fi
update-desktop-database &> /dev/null || :


%clean
rm -rf $RPM_BUILD_ROOT


%files
%defattr(-,root,root,-)
%{_javadir}/*
%{_datadir}/%{name}/
%{_datadir}/applications/%{name}.desktop
%{_datadir}/pixmaps/%{name}.xpm
%{_bindir}/%{name}
%doc source/aREADME.txt source/release-notes.html source/applet.html

%files javadoc
%defattr(-,root,root,-)
%{_javadocdir}/%{name}


%changelog
* Wed Feb 09 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.44-2.i
- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild

-----------------------------------------------------------------------


-----------------------------------------------------------------------
#!/bin/bash 
# A wrapper script to launch imagej from the UNIX command line
# Images given as arguments will be opened, macros may also be given as arguments
# Looks for macros in the imagej macro directory
#
# This program is free software, but comes with no warrenty or guarantee
# send bug reports or feedback to jjackson at familyjackson dot net
# Author: Jon Jackson
# Maintainer : Fabien Georget for fedora
# Last modified date: 2010-10-30
# Revision: 53
#
#
### WARNING ###########################################################
# This file must be edited with a program that supports unix new line characters
# - it won't run if edited in 'Notepad' !
#######################################################################

# setup environment
set +u 
# don't give error for unset variables (matters for environment variables)
shopt -s extglob # allow extended pattern matching

############ SITE SPECIFIC VARIABLES #########################
# Trailing / is not required for path variables
# IMAGEJ PATH - production installation
ij_path='/usr/share/java'
#path to data files
ij_data_path='/usr/share/imagej'
# Path to user
ij_user_path="${HOME}/.imagej"
# JAVA PATH
JAVA_HOME=$(dirname $(dirname $(readlink /etc/alternatives/java)))
# report bug to http://bugzilla.redhat.com/
ijadmin='Fedora project'
# DOCUMENTATION URL
doc_url='http://rsb.info.nih.gov/ij/'

# TEMP FOLDER
ij_tmp="${HOME}/.imagej/tmp"
# LOG FILE
#ij_log="${ij_tmp}/log.txt"
# default behaviour when an ImageJ window is already open
newwindow='true'
#newwindow='false'
# macro argument delimiter character
separator=':'
# a ' ' may work provided no arguments would contain spaces
# use macro functions:  args=getArgument(); argArray=split(args, ':'); 
# to recover macro arguments

############ DEFAULT MEMORY SETTINGS  #########################

declare -i default_mem=768
declare -i min_mem=32
declare -i max_32bit=1800 # empirical
declare -i max_64bit=17000000000 # conservative

############ SITE SPECIFIC MODULES #########################

# JAR libraries for additional modules may be placed in ${ij_path}/lib
# jmf.jar jai_codec.jar jai_core.jar mlibwrapper_jai.jar

# Native libraries may be placed in ${ij_path}/lib/$OS
# where OS matches the output of the 'uname' command

############ END SITE SPECIFIC VARIABLES #########################

OS=$(uname)
processor=$(uname -m) # -p doesn't work on ubuntu
declare -i mem
declare -i max_mem
declare -i free_mem

java_path="${JAVA_HOME}/bin/java"

if [[ "$OS" == 'Linux' ]] ; then
	if [[ "$processor" == 'x86_64' ]] ; then
    	java_arch='-d64'
    	max_mem=`free | awk -v maxMem=$max_64bit 'NR == 2 {fmem=int($2 / 1024); if (fmem < maxMem) {print fmem} else {print maxMem}}'`
		free_mem=`free | awk -v maxMem=$max_64bit 'NR == 3 {fmem=int($4 / 1024); if (fmem < maxMem) {print fmem} else {print maxMem}}'`
		mem=${free_mem}/3*2
		if (( $mem > $default_mem || $mem < $min_mem )) ; then mem=$default_mem ; fi
	else
		java_arch='-d32'
    	max_mem=`free | awk -v maxMem=$max_32bit 'NR == 2 {fmem=int($2 / 1024); if (fmem < maxMem) {print fmem} else {print maxMem}}'`
		free_mem=`free | awk -v maxMem=$max_32bit 'NR == 3 {fmem=int($4 / 1024); if (fmem < maxMem) {print fmem} else {print maxMem}}'`
		mem=${free_mem}/3*2
		if (( $mem > $default_mem || $mem < $min_mem )) ; then mem=$default_mem ; fi	
	fi
fi


# create plugins, macros, luts dirs
mkdir -p $ij_user_path/plugins
mkdir -p $ij_user_path/macros
mkdir -p $ij_user_path/luts

if [[ ! -d "$ij_tmp" ]] ; then
    mkdir -p "$ij_tmp"
fi

# makes symbolik links from shared plugins, macros and luts 

ls $ij_data_path/plugins | while read p ; do
  if [ ! -e "$ij_user_path/plugins/$p" ] ; then
    ln -s $ij_data_path/plugins/$p $ij_user_path/plugins/$p
  fi
done

ls $ij_data_path/macros | while read p; do
  if [ ! -e "$ij_user_path/macros/$p" ] ; then
      ln -s "$ij_data_path/macros/$p" "$ij_user_path/macros/$p"
  fi
done

ls $ij_data_path/luts | while read p ; do
    if [ ! -e "$ij_user_path/luts/$p" ] ; then
	ln -s $ij_data_path/luts/$p $ij_user_path/luts/$p
    fi
done

# enable plugins to be compiled with imageJ
tools="${JAVA_HOME}/../lib/tools.jar"

# End Site specific variables ---------------------------------------------------------

# other variables 
dir=`pwd`
user=`whoami`
host=`hostname`
if [[ -z "$DISPLAY" ]] ; then
    echo 'Display variable not set'
    echo 'If ImageJ fails to load, try '
    echo '% setenv DISPLAY yourcomputer:0'
    echo 'if you use the "csh" or for "bash" try'
    echo '% export DISPLAY=yourcomputer:0'
    display='default' 
else
    display="$DISPLAY"
fi

declare -i port=0
declare -i verbosity=0
images=''
macrocmd=''
macroargs=''


function usage {
    echo 
    echo 'Image display and analysis program. Opens formats including:'
    echo 'UNC, Analyze, Dicom, NIFTI, Tiff, Jpeg, Gif, PNG ...'  
    echo
    echo 'imagej [options] image [ image2 ... image3 ]'
    echo '    -h        print help and more options'
    echo '    -o        open images in an open ImageJ panel'
    echo '    -p <N>    open images in ImageJ panel number <N>' 
    echo "    -x <MB>   set available memory (default=${mem} max=${max_mem})"     
    echo 
}

function fullusage {
    echo 
    echo 'Image display and analysis program. Opens formats including:'
    echo 'UNC, Analyze, Dicom, NIFTI, Tiff, Jpeg, Gif, PNG ...'  
    echo 
    echo 'imagej [options] image [ image2 ... image3 ] -> open images'
    echo
    echo 'basic options:'
    echo '  -h        print help and more options'
    echo '  -o        open images in existing ImageJ panel if one exists'
    echo '  -p <N>    open images in existing ImageJ panel number <N>' 
    echo "  -x <MB>   set available memory (default=${mem} max=${max_mem})"
    echo
    echo 'advanced options:'
    echo '  -c        enable plugin compilation within imagej'
    echo '  -d        use development version'
    echo '  -v        be verbose (vv or vvv increases verbosity)'  
    echo
    echo 'options for batch processing:'
    echo "  -e 'Macro Code'            execute macro code"
    echo "  -r 'Menu Command'          run menu command"
    echo "Quotation marks '' are required around commands including spaces"
    echo 'Commands can be sent to open ImageJ panels with the -p option'
    echo 
    echo 'options for macros:'
    echo 'imagej [-i image] [-b|-m] [arg1 ... argN] '
    echo '  -b macro    run macro without graphics window' 
    echo '  -m macro    run macro' 
    echo '"image" will be opened before macro is run'
    echo 'all following arguments are passed to macro'        
    echo 
    echo "Documentation - $doc_url "
	echo "Report problems with this software to $ijadmin"
    echo
}

function macroCmdError {
	fullusage 
	echo 'Only one command option (-b -e -m OR -r) may be specified' 1>&2
	exit 1
}

function getFullPath {
    # Return full path to file
    # treats multiple arguments as a single file with spaces
    if (( $# == 0 )) ; then
        echo "error getting full path for '${*}'" 1>&2
    fi
    pwd_getFullPath="$PWD"
    \cd $(dirname "${*}") > /dev/null
    dir_getFullPath="$PWD"
    \cd "$pwd_getFullPath" > /dev/null
    echo "$dir_getFullPath"/$(basename "${*}")
}
function derefln { 
    # Returns the full path of file to which link points
    # following multiple levels of symbolic links.
    # NOTE: if you use this function in a script, don't use any
    # of the variable names used here
    if (( $# == 0 )) ; then
        return
    fi
    local the_link="$1"
    local link_dir 
    local current_dir="$PWD"
    while file "$the_link" | grep symbolic > /dev/null ; do # resolve links until target is regular file
        if [[ "$the_link" == */* ]] ; then # path contains  /
            \cd $(dirname "${the_link}") > /dev/null
            the_link=$(basename "$the_link")
        fi
        link_dir="$PWD" 
	    # some versions of 'file' surround the path in `' quotes, hence the tr to remove them
        the_link=$(file "${the_link}" | awk '/symbolic link/ {print $NF}' | tr -d "\140\047" )
        if [[ "$the_link" != /* ]] ; then # path is not absolute path  - make it one
            the_link="$link_dir/$the_link"
        fi
        \cd "$current_dir" > /dev/null
    done 
    echo $the_link
}


# parse input arguments
while getopts b:cde:hi:m:nop:r:vx: options
do
	case $options in
		b)	if [[ -n "$macrocmd" ]] ; then macroCmdError ; fi
			macrocmd="-batch ${OPTARG}"
			;;
		c)	modules="${modules:-}${modules+:}${tools}"
			;;
		d)	ij_path="$ij_path_dev"
			;;
		e)  if [[ -n "$macrocmd" ]] ; then macroCmdError ; fi
			macrocmd='-eval'
			macroargs="'${OPTARG}'"
			;;
		h)  fullusage
			exit 0
			;;
		i)  images="${images}'${OPTARG}' "
			;;
		m)	if [[ -n "$macrocmd" ]] ; then macroCmdError ; fi
			macrocmd="-macro ${OPTARG}"
			;;
        n)  newwindow='true'
            ;;
		o)  newwindow='false'
			;;
		p)	newwindow='false'
			port="${OPTARG}"
        	if (( "$port" < 1 || "$port" > 99 )) ; then
            	echo "${OPTARG} is not a permissible value for port number (-p)" 1>&2
            	exit 1
        	fi
			;;
		r)	if [[ -n "$macrocmd" ]] ; then macroCmdError ; fi
			macrocmd='-run'
			macroargs="'${OPTARG}'"
			;;
		v)	verbosity=verbosity+1
			if (( $verbosity == 2 )) ; then set -x ; fi
			if (( $verbosity == 3 )) ; then set -v ; fi
			;;
		x)	mem="${OPTARG}"
            newwindow='true'
			if (( $mem < $min_mem || $mem > $max_mem )) ; then
            	echo "${OPTARG} is not a permissible value for memory (-x)" 1>&2
            	echo "min=${min_mem}, max=${max_mem}" 1>&2
            	exit 1				
			fi
			;;
		\?) usage
			exit 1 
			;;
	esac
done
			
#for ((i=1; i < $OPTIND; i++)) 
#do
#	shift
#done
## above syntax not supported in bash < 2.05
declare -i i=1
while (( i < $OPTIND )) ; do
	shift
	i=i+1
done

if [[ "$#" == 0 && -z "$macrocmd" ]] ; then
	usage
fi	

# The best way to install .jar libraries required by plugins is to copy them 
# to the imagej plugins/jars directory
# Alternatively, either copy them to ${ij_path}/jre/lib/ext/ or add the .jar
# filepath to the modules line below. Paths are separated by a colon
# Classpath must follow command line arguments, as ij_path is dependent on the -d option

# Resolving ij.jar path.  If ij.jar is a symbolic link to ij_<version>.jar
# this allows updating ij.jar without crashing running sessions
ij_jar_path=$(derefln ${ij_path}/imagej.jar)    
                                         
for mod_jar in ${ij_path}/*jar  ; do
    modules="${modules:-}${modules+:}$mod_jar"
done
modules="-cp ${ij_jar_path}:${modules+:}${modules:-}"
#${ij_path}/plugins/jars/dcmie.jar

export LD_LIBRARY_PATH="${ij_path}/lib/${OS}_$processor"
if (( $verbosity > 0 )) ; then
    echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH"
fi

# -b and -m options only:
# remaining command line arguments are passed as macro arguments 
# separated by $separator
if [[ -n "$macrocmd" && -z "$macroargs" ]] ; then
	while (( "$#" > 0 )) ; do
        if [[ -z "$macroargs" ]] ; then 
            macroargs="${1}"
        else
            macroargs="${macroargs}${separator}${1}"
        fi
        shift 		
	done
	macroargs="'$macroargs'"
fi

# PROTECT POSSIBLE SPACES IN IMAGE FILENAMES
if (( "$#" > 0 )) ; then
	while (( "$#" > 0 )) ; do
        filearg="${1}"
        # full file path required when sending images to running ImageJ panel
        if [[ "${newwindow}" == 'false' && -f "${filearg}" ]]  && ! expr "${filearg}" : '/.*' > /dev/null; then 
            filearg="$(getFullPath ${filearg})"
        fi
		images="${images}'$filearg' "
		shift 
	done
fi	

# CREATE IMAGEJ SOCKET-LOCK DIRECTORY IF NON EXISTANT 
if [[ ! -d "$ij_tmp" ]] ; then
    mkdir "$ij_tmp"
    chmod 777 "$ij_tmp"
fi

# CREATE IMAGEJ LOG FILE IF NON EXISTANT 
if [[ -n "$ij_log" && ! -f "$ij_log" ]] ; then
    touch "$ij_log"
    chmod 666 "$ij_log"
fi

# CREATES A TEMP FILE INDICATING A PORT IS IN USE BY IMAGEJ
cd "$ij_tmp"
declare -i count=1
portopen='false'
lockFileCreated='false'
declare -a locklist=(`ls | grep '[0-9][0-9]-.*'`)

[[ -n "$ij_log" ]] && echo -e "$$\t$(date)\tNew Window = $newwindow" >> "$ij_log" 2> /dev/null
[[ -n "$ij_log" ]] && echo -e "$$\t$(date)\tPort = $port" >> "$ij_log" 2> /dev/null
[[ -n "$ij_log" ]] && echo -e "$$\t$(date)\tlocklist: \n ${locklist[*]}" >> "$ij_log" 2> /dev/null
if (( $verbosity > 0 )) ; then echo -e "locklist: \n ${locklist[*]}" ; fi

# PORT SPECIFIED BY USER
if (( $port > 0 )) ; then
    # look for a lock on the port specified
    for lockname in ${locklist[*]} ; do
        prefix=`printf '%02u' $port`
        if [[ "$lockname" == ${prefix}-${user}-${host}* ]] ; then
        	# found lock on the requested port, owned by user on current display
            portopen='true'
            if (( $verbosity > 0 )) ; then echo "Using socket lock: $lockname" ; fi
            count=$port
            break
        elif [[ "$lockname" == ${prefix}-* ]] ; then
            echo "Port $port is in use by some other user or a different host" 1>&2
            if (( $verbosity > 0 )) ; then echo "Port lock: $lockname" ; fi
            exit 1
        fi
    done 
    # specified port not in use 
    count=$port

# IF EXISTING WINDOW IS REQUESTED, LOOK FOR LISTENING PORT
elif [[ "$newwindow" == 'false' && ${#locklist} != 0 ]] ; then
    # look for a lock on the current display for this user
    for lockname in ${locklist[*]} ; do
        if [[ "$lockname" == [0-9][0-9]-${user}-${host}-${display} ]] ; then
            portopen='true'
            if (( $verbosity > 0 )) ; then echo "Found socket lock: $lockname" ; fi
            # if a matching user/display is found, use this one
            count="${lockname%-*-*-*}"
            #count=`echo $lockname | sed  -e 's/^\([0-9][0-9]\).*/\1/' -e 's/^0//'` # csh?
            break
        fi
    done
fi

# IF A NEW PORT IS TO BE USED
if [[ "$portopen" == 'false' ]] ; then
    # new window requested or no matching port found
    # if port is not specified, look for first free port
    if (( "$port" == 0 )) ; then 
        if (( ${#locklist} == 0 )) ; then
            # no active locks - use first port
            count=1
        else
            # active locks - check each port number so see if it is in use
            # this is not synchronised!!
            count=0
            inuse='true'
            while [[ "$inuse" == 'true' ]] ; do
                count=count+1
                prefix=`printf '%02u' $count`
                inuse='false'
                for lockname in ${locklist[*]} ; do
                    if [[ "$lockname" == ${prefix}-* ]] ; then
                        inuse='true'
                    fi
                done
            done
        fi
    fi
    # CREATING A NEW PORT LOCK
    prefix=`printf '%02u' $count`
    lockname=${prefix}-${user}-${host}-${display}
    
    [[ -n "$ij_log" ]] && echo -e "$$\t$(date)\tCreating lock\t$lockname" >> "$ij_log" 2> /dev/null
	if (( $verbosity > 0 )) ; then echo -n "creating lock $lockname ... " ; fi
	touch $lockname
	trap '\rm -f ${ij_tmp}/$lockname >/dev/null ; [[ -n "$ij_log" ]] && echo -e "$$\t$(date)\tReleasing lock\t$lockname" >> "$ij_log" 2> /dev/null' EXIT TERM KILL 
	# Quitting ImageJ sends EXIT, as does a kill/kill -9 
	# CTRL+C in terminal sends INT + EXIT
	# System shutdown sends TERM (+EXIT??)
	
	if (( $verbosity > 0 )) ; then  echo 'done' ; fi

    lockFileCreated='true'
    if [[ -z "$macrocmd" ]] ; then 
	    echo 'Open other images in this ImageJ panel as follows:'
	    echo "  imagej -p $count <image1> [<image2> ... <imageN>]"
    fi
    [[ -n "$ij_log" ]] && echo -e "$$\t$(date)\tSocket lock:\t$lockname" >> "$ij_log" 2> /dev/null
    if (( $verbosity > 0 )) ; then echo "Socket lock: $lockname" ; fi
	echo
fi

if (( $verbosity > 0 )) ; then
    echo ${JAVA_HOME}/bin/java ${java_arch} -mx${mem}m ${modules} ij.ImageJ -ijpath ${ij_user_path} -port${count} ${images} ${macrocmd} ${macroargs}
fi

cd "$dir"
eval "${JAVA_HOME}/bin/java ${java_arch} -mx${mem}m ${modules} ij.ImageJ  -ijpath ${ij_user_path} -port${count} ${images} ${macrocmd} ${macroargs} "
exit 0
------------------------------------------------------------------
Comment 1 Manuel Hiebel 2011-11-15 16:15:18 CET
It's better to add an attachment for your spec instead of copy-paste ;)

URL: (none) => http://rsb.info.nih.gov/ij/index.html
Source RPM: (none) => imagej
Severity: normal => enhancement

Comment 2 JeanClaude Colette 2011-11-15 19:29:22 CET
Created attachment 1059 [details]
spec file for imagej

spec file for imagej
Comment 3 JeanClaude Colette 2011-11-15 19:30:30 CET
Created attachment 1060 [details]
imagej.sh

imagej.sh file to put in SOURCES
Comment 4 Barry Jackson 2011-11-20 17:09:18 CET
Duplicate of bug #2197
I will take a look at your spec ;)

*** This bug has been marked as a duplicate of bug 2197 ***

Status: NEW => RESOLVED
CC: (none) => zen25000
Resolution: (none) => DUPLICATE