WebObjects & WOnder Examples

I have tried some examples today, but a lot won’t work. Damn.

Movies

This example you can find on ~/WODevelopment/WonderSource/Examples/Misc/Movies. After the import of the project into Eclipse I started it as WOApplication. Choose the class er.movies.Application as start point. The console window displays an exception:

java.lang.NoClassDefFoundError: er/corebusinesslogic/ERCoreUserInterface

Seems to be simple, add a WebObjects library to the build path of the project: ERCoreBusinessLogic. Restart the application. The next exception:

java.lang.ClassNotFoundException: er.directtoweb.ERDirectToWeb

Now add the library ERDirectToWeb to the project. Restart the application. Repeat that x times, or simply add the following libraries to the project too:


ERJavaMail
JavaDirectToWeb
JavaEOProject
JavaDTWGeneration

Now, the application starts. But there is a warning:

Your application is not running on a supported development platform. AutoLaunch will not work.

This means, you have to copy the visible URL into a browser’s address line to see the example. Very annoying. Google provides a solution:

public boolean _isSupportedDevelopmentPlatform() {
	boolean result = super._isSupportedDevelopmentPlatform();
	if (!result) {
		result = System.getProperty("os.name").equals("Linux");
	}
	return result;
}

The warning will be replaced with another warning (WTF?):

Unable to locate /usr/bin/open on your computer, AutoOpen launch will not work

Seems that Ant will open a browser by calling the statement above. Try to symlink Firefox:

# su -
# ln -s /usr/bin/firefox /usr/bin/open
# exit

Restart the application and (surprise, surprise!) the Firefox displays the Movies application!

Project Wonder investigations

After some hours I found a reference to the /System/Library/Frameworks in the build process of the Wonder source (Build/build/generic.xml). But the System directory doesn’t exist in my installation, until I create it manually. So the directory is empty, but I think, the build process of WOnder looks there for the WebObjects frameworks.

I uncompressed the WOInstaller.jar and I found in the com.mdimension.woinstaller.Main a hint:

On non-OS.X systems (as my Linux) the original directory structure will be shuffled. The original /System/Library is moved to /Library, the original /Library is moved to /Local/Library. I think, this is important for the wolips.properties file.

The start of the WOInstaller with an os.name property with the value “os x” will not work (this could bypass the folder shuffle), it results in an exception in java.lang.UNIXProcess$Platform.get(). With this knowledge I have switched the folders back after the normal installation:

# cd /home/arothe/WODevelopment/Libraries/WOnder
# mkdir System
# mv Library System/.
# mv Local/Library Library
# rm -rf Local

Now the mapping is like the following, it matches with the documentation (which refers OS X often):

wo.system.frameworks=/home/arothe/WODevelopment/Libraries/WOnder/System/Library/Frameworks
wo.local.frameworks=/home/arothe/WODevelopment/Libraries/WOnder/Library/Frameworks
wo.user.frameworks=/home/arothe/WODevelopment/Libraries/WOnder/User/Library/Frameworks

Within Eclipse projects the build.xml needs the wolips.properties on /home/arothe/WODevelopment/Libraries/WOnder/Library/Application Support/WOLips. But it creates the path from ${user.home}, which is /home/arothe but not /home/arothe/WODevelopment/Libraries/WOnder. So I have set the property user.home within Eclipse on the global level for Ant within “Windows->Preferences->Ant->Runtime->Properties” to the new path (it seems that I cannot set this per project).

The Wonder source doesn’t need a wobuild.properties nor build.properties within the WonderSource folder. It uses the wolips.properties on “/home/arothe/WODevelopment/Libraries/WOnder/Library/Application Support/WOLips/wolips.properties” which I have symlinked to “/home/arothe/WODevelopment/wolips.properties”. Also the build.xml of the Eclipse projects use this path.

To start the build process of the Wonder source, we need to define the new user.home too:

# cd ~/WODevelopment/WonderSource
# ant -Duser.home=/home/arothe/WODevelopment/Libraries/WOnder frameworks

After these changes all is fine. The Wonder source compiles with Ant, the projects in Eclipse can be run and installed.

To finish the last step, the installation of the frameworks on the local webserver, I have found a property “wo.server.root”, which is defined in WonderSource/Build/build/default.properties as /Library/WebServer/Documents/WebObjects. This I have changed to “/srv/www/htdocs/WebObjects” within the wolips.properties (it overrides the default settings). I have to execute the following statement as root:

# su -
# cd /home/arothe/WODevelopment/WonderSource
# ant -Duser.home=/home/arothe/WODevelopment/Libraries/WOnder frameworks.install

This runs successsfully, all frameworks are installed in /srv/www/htdocs/WebObjects/Frameworks.

Book about WebObjects

Today I found a book on the Kindle Shop, which describes the install process for WebObjects, WOLips and Project Wonder. It is possible to read these chapters for free: Markus Ruggiero: Learning the Wonders.

But the book did not solve my install problem, I have to look deeper.

Install Eclipse with WOLips plugin

(corrected post after some more investigations)

I use an application on the office, which is based on WebObjects. To understand, how the application works, I’ll try to go deeper into the WebObjects framework.

To develop applications with WebObjects, you can use Eclipse with the WOLips plugin.

I decided to install Eclipse Neon:
Neon.3

Download the package as tar.gz into /tmp.
Switch to root and uncompress the package to /opt

# su -
# cd /opt
# mv /tmp/eclipse-java-neon-3-linux-gtk-x86_64.tar.gz .
# tar xvzf eclipse-java-neon-3-linux-gtk-x86_64.tar.gz
# mv eclipse eclipse-java-neon-3
# chown -R arothe:users eclipse-java-neon-3
# exit

As non-privileged user you should now create a directory, which will hold all the WebObjects stuff, including your Eclipse workspace. There is also a warning, that you should not use folder names with space characters and special characters.

# cd
# mkdir -p WODevelopment/workspace

Open the Eclipse platform as non-privileged user (you) and choose your workspace directory (see above, ~/WODevelopment/workspace).
Now it is time to download the WOLips plugin. Go to “Help->Install New Software” and click the “Add” button. Now enter the following URL:

Name: WOLips for Eclipse 4.6
Location: https://jenkins.wocommunity.org/job/WOLips46/lastSuccessfulBuild/artifact/temp/dist/

For a Linux-based installation choose WOLips, not the optional package. The latter will only work on Windows and Mac. You must restart Eclipse to finish the installation process. After the installation you have to change the perspective of Eclipse to WOLips. There you can see a lot of new menu items and taskbar icons.

As described in “Learning The Wonders”, I create more folders:

# cd
# mkdir -p WODevelopment/Libraries/WOnder/User/Library/Frameworks
# mkdir -p WODevelopment/Libraries/WOnder/Network/Library/Frameworks
# mkdir -p WODevelopment/WonderSource
# mkdir -p WODevelopment/Tools
# ln -s /opt/eclipse-java-neon-3/ WODevelopment/Tools/eclipse-java-neon-3

I have to install the WebObjects framework files. There is an installer, which I can use. The installer is available on http://wocommunity.org/documents/tools/WOInstaller.jar.

# cd ~/WODevelopment/Tools
# curl -O http://wocommunity.org/documents/tools/WOInstaller.jar
# cd
# java -jar WODevelopment/Tools/WOInstaller.jar 5.4.3 ~/WODevelopment/Libraries/WOnder

This creates new stuff within ~/WODevelopment/Libraries/WOnder. Rename some folders, which are shuffled from the installer:

# cd /wo-destination
# mkdir System
# mv Library System/.
# mv Local/Library Library
# rm -rf Local

To work with WOLips in Eclipse, we need an important file, wolips.properties. This I can store into ~/WODevelopment/wolips.properties.

wo.api.root=/home/arothe/WODevelopment/Libraries/WOnder/Developer/Documentation/DocSets/com.apple.ADC_Reference_Library.WebObjectsReference.docset/Contents/Resources/Documents/documentation/InternetWeb/Reference/WO542Reference
wo.apps.root=/home/arothe/WODevelopment/Libraries/WOnder/Library/WebObjects/Applications
wo.bootstrapjar=/home/arothe/WODevelopment/Libraries/WOnder/System/Library/WebObjects/JavaApplications/wotaskd.woa/WOBootstrap.jar
wo.extensions=/home/arothe/WODevelopment/Libraries/WOnder/Library/WebObjects/Extensions
wo.local.frameworks=/home/arothe/WODevelopment/Libraries/WOnder/Library/Frameworks
wo.local.root=/home/arothe/WODevelopment/Libraries/WOnder
wo.network.frameworks=/home/arothe/WODevelopment/Libraries/WOnder/Network/Library/Frameworks
wo.network.root=/home/arothe/WODevelopment/Libraries/WOnder/Network
wo.system.frameworks=/home/arothe/WODevelopment/Libraries/WOnder/System/Library/Frameworks
wo.system.root=/home/arothe/WODevelopment/Libraries/WOnder/System
wo.user.frameworks=/home/arothe/WODevelopment/Libraries/WOnder/User/Library/Frameworks
wo.user.root=/home/arothe/WODevelopment/Libraries/WOnder/User
wolips.properties=/home/arothe/WODevelopment/wolips.properties

Store this file and create a new directory, which is the default search path for the wolips.properties. The build procedures look there for the file, but to edit it, its better to have it on the top-most folder.

# cd
# mkdir -p "/home/arothe/WODevelopment/Libraries/WOnder/Library/Application Support/WOLips"
# ln -s /home/arothe/WODevelopment/wolips.properties "/home/arothe/WODevelopment/Libraries/WOnder/Library/Application Support/WOLips/wolips.properties"

Open in Eclipse “Window->Preferences”. On the left side there must be a category “WOLips”. There I can setup the new wolips.properties file and leave the textfield with TAB. Now you can see the new folders. Click on every textfield, there must no error be visible on top of the window. You cannot create valid projects until you have installed the WebObjects framework and have configured it right within Eclipse. There is a strange error: sometimes WOLips forgets the configured file and folders. After you close the configuration window, you should come back and look, whether or not the new settings are still there.

I have created a new “WebObjects Application” within Eclipse. There shouldn’t any errors (maybe a warning of Java1.5 compatibility). Right-click on the project and choose “WOLips Ant Tools->Install”. This should run without any errors (warnings are okay). If there is a problem with an EO* framework, you have to set a new user.home property for the Ant process. It can be set on Window->Preferences->Ant->Runtime->Properties. Add a new global property like:

user.home
/home/arothe/WODevelopment/Libraries/WOnder

Test the Ant install process again, you can delete the project, if all is fine.

To install the Project Wonder stuff I need the git-Tools first. As root we have to install some packages (look for git in your software repository, sometimes the package is named “git”, sometimes “git-all”):

# su -
# yum install git-all
# exit

As unprivileged user you can now clone the Git repository:

# cd ~/WODevelopment
# git clone https://github.com/wocommunity/wonder.git WonderSource

Now we have the source code, but we need the binary frameworks, which will be linked to our Wonder projects. To build these frameworks on the commandline, we need a local Ant installation. Download Ant (e.g. 1.9.9) and uncompress the archive into /opt:

# su -
# cd /opt
# curl -O http://ftp.fau.de/apache//ant/binaries/apache-ant-1.9.9-bin.tar.gz
# tar xvzf apache-ant-1.9.9-bin.tar.gz
# chown -R root:root /opt/apache-ant-1.9.9
# exit

The environment variables ANT_HOME and JAVA_HOME must be set, both can be made within the .bash_profile of the non-privileged user or globally in /etc/profile.d

export ANT_HOME=/opt/apache-ant-1.9.9
export JAVA_HOME=/opt/jdk1.8.0_25
export PATH=${PATH}:${ANT_HOME}/bin

Test the Ant installation as non-privileged user with

# ant -version
Apache Ant(TM) version 1.9.9 compiled on February 2 2017

Now I can start the build process of the WOnder frameworks.

# cd
# cd WODevelopment/WonderSource
# ant -Duser.home=/home/arothe/WODevelopment/Libraries/WOnder frameworks

All frameworks will be built. Open the Eclipse and create a new “WOnder project”. The project in Eclipse can be run and install.

To finish the last step, the installation of the frameworks on the local webserver, I have found a property “wo.server.root”, which is defined in WonderSource/Build/build/default.properties as /Library/WebServer/Documents/WebObjects. This I have changed to “/srv/www/htdocs/WebObjects” within the wolips.properties. I have to execute the following statement as root (superuser because of the file permissions for /srv/www/htdocs/WebObjects):

# su -
# cd /home/arothe/WODevelopment/WonderSource
# ant -Duser.home=/home/arothe/WODevelopment/Libraries/WOnder frameworks.install

This runs successsfully, all frameworks are installed in /srv/www/htdocs/WebObjects/Frameworks.

Install OCI8 for PHP

rpm -ivh oracle-instantclient-basic-linux.XXX.rpm 
rpm -ivh oracle-instantclient-devel-linux.XXX.rpm

yum install php-pear php-devel zlib zlib-devel bc libaio glibc
yum groupinstall "Development Tools"

ln -s /usr/include/oracle/XXX/client64 /usr/include/oracle/XXX/client
ln -s /usr/lib/oracle/XXX/client64 /usr/lib/oracle/XXX/client
mkdir /opt/iclient

Create a file inside /etc/profile.d named oracle.sh and put this as the content:

export LD_LIBRARY_PATH=/usr/lib/oracle/XXX/client64/lib:${LD_LIBRARY_PATH}
export TNS_ADMIN=/opt/iclient
export NLS_LANG=GERMAN_GERMANY.UTF8
export SQLPATH=/usr/lib/oracle/XXX/client64/lib:${SQLPATH}

And run it so we’ll have LD_LIBRARY_PATH as an environment variable.

source /etc/profile.d/oracle.sh

Use ‘oci8’ to install for PHP 8.
Use ‘oci8-2.2.0’ to install for PHP7
Use ‘oci8-2.0.12’ to install for PHP 5.2 – PHP 5.6.
Use ‘oci8-1.4.10’ to install for PHP 4.3.9 – PHP 5.1.
The OCI8 extension can be linked with Oracle client libraries from Oracle Database 19.9, 12.2, 12.1, 11, or 10.2.

pear download pecl/oci8-2.0.12 
tar -xvf oci8-2.0.12.tgz
cd oci8-2.0.12

phpize ./configure --with-oci8=shared,instantclient,/usr/lib/oracle/XXX/client64/lib
./configure --with-oci8=shared,instantclient,/usr/lib/oracle/XXX/client64/lib
make
make install

If you run into such an error:

error: oci8_dtrace_gen.h: No such file or directory

try to solve it with Stackoverflow:26145605.
To enable the extension, add a file named oci8.ini in /etc/php.d with this content:

extension=oci8.so

Restart Apache Webserver.

Copy your tnsnames.ora and sqlnet.ora to /opt/iclient.

List all files recursively with absolute path names

Sometimes you need a list of all files within a directory and its sub-directories. This is useful i.e. for a .m3u file.

# find /parent-path -type f | grep -v m3u | sort > something.m3u

The command lists all files, removes all “m3u” files (which could be generated by an audio ripper) and sorts the lines by name.

Copy a HDD to SSD

I have an old laptop with Ubuntu 15.x and bought a new SSD to speedup the system a little bit. To copy the whole system from the HDD to the SSD you need to align the new partition on sector numbers which are dividable by 4096. So I have to create a primary partition starting on sector 4096 of the SSD and a Linux Swap partition. Use gparted and check the sector numbers twice.

To copy the existing data I found an article, which uses rsync:

rsync -rvlpogdstHEAX /hdd/ /ssd

It copies the Grub too, but in my case, the Grub uses UUIDs, which differ between HDD and SSD. So I have to change the grub.cfg manually:

chmod 644 /boot/grub/grub.cfg
vim /boot/grub/grub.cfg

Use now the vim replace function:

:%s/old-uuid/new-uuid/g

It replaces all occurrences of old-uuid with new-uuid. Then you need to open /etc/fstab and replace the UUIDs for the primary partition and the Swap partition too.

Install the SSD on the computer and start it, it boots your old system.

List all directories for group has access to

find ${dir} -type d -group ${group} -perm -g=r -print

Get all used ports

To find all used ports on a server use

# netstat -nlp

Count all folders recursively

   ls -lR | grep ^d | wc -l

ls -lR gets a long format of all files and directories of a given folder. Every line which contains a directory starts with d as the first character. So grep ^d filters all such lines (^ is for Beginning-Of-Line). wc -l counts the Newline characters in a given file or stdin. Because every line contains a single directory entry and every line ends with a newline character, you will get the number of the directories.