The upgrade utility is used to generate an upgrade
plan based on a detailed analysis of class changes. The
generated upgrade plan is used to deploy the upgraded
class files. A complete reference for the upgrade utility can be found in
the section called “Upgrade utility”. Example 8.2, “Initial class definition” shows a simple
Person class definition.
Example 8.2. Initial class definition
package com.kabira.snippets.upgrade;
import com.kabira.platform.annotation.Managed;
@Managed
public class Person
{
Person()
{
name = "Patti Smith";
age = 64;
}
String name;
short age;
}Example 8.3, “Updated class definition” shows an updated
Person class with these changes:
Change the name field to two fields -
first and last.
Change the type of the age field to an
Integer.
Add a new base class - Animal.
The new Person class was also updated to
implement Serializable,
ObjectMismatchTrigger, and to add a
serialVersionUID as described in the section called “Changing a class”.
Example 8.3. Updated class definition
// $Revision: 1.1.2.1 $
package com.kabira.snippets.upgrade;
import com.kabira.platform.ManagedObjectStreamClass;
import com.kabira.platform.ObjectMismatchTrigger;
import com.kabira.platform.annotation.Managed;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectStreamField;
import java.io.Serializable;
/*
//
// Original class
//
@Managed
public class Person
{
Person()
{
name = "Patti Smith";
age = 64;
}
String name;
short age;
}
*/
//
// New parent type
//
@Managed
class Animal
{
Animal()
{
type = "Human";
}
String type;
}
//
// Updated class definition
//
public class Person extends Animal
implements Serializable, ObjectMismatchTrigger
{
Person()
{
first = "Patti";
last = "Smith";
age = 64;
}
@Override
public void writeObjectToStream(
ManagedObjectStreamClass remoteClassDescriptor,
ObjectOutputStream out) throws IOException
{
System.out.println("writeObjectToStream: "
+ remoteClassDescriptor.getName());
//
// Output old and new version numbers
//
System.out.println("\tOld Class Version: "
+ remoteClassDescriptor.getSerialVersionUID());
System.out.println("\tNew Class Version: " + serialVersionUID);
//
// Write fields to old version of class using ManagedObjectStreamClass
//
for (ObjectStreamField f : remoteClassDescriptor.getFields())
{
//
// If name field, concatenate first and last name in new version
//
if (f.getName().equals("name"))
{
System.out.println("\t\tname field: " + first + " " + last);
out.writeObject(first + " " + last);
}
//
// If age field, map to short. This may truncate the age of
// _very_ old people
//
else if (f.getName().equals("age"))
{
System.out.println("\t\tage field: " + age);
short oldAge = age.shortValue();
out.writeShort(oldAge);
}
}
}
@Override
public void readObjectFromStream(
ManagedObjectStreamClass remoteClassDescriptor,
ObjectInputStream in) throws IOException
{
System.out.println("readObjectFromStream: "
+ remoteClassDescriptor.getName());
//
// Output old and new version numbers
//
System.out.println("\tOld Class Version: "
+ remoteClassDescriptor.getSerialVersionUID());
System.out.println("\tNew Class Version: " + serialVersionUID);
//
// Read fields from the old version of the class using
// ObjectInputStreamGetField to access the fields
//
try
{
ObjectInputStream.GetField fields = in.readFields();
//
// Get name field
//
String name = (String) fields.get("name", "");
System.out.println("\t\tname: " + name);
String[] values = name.split(" ");
first = values[0];
last = values[1];
//
// Get age field
//
Short previousAge = fields.get("age", (short)0);
age = previousAge.intValue();
System.out.println("\t\tage: " + age);
}
catch (ClassNotFoundException ex)
{
System.out.println("ERROR: " + ex.getMessage());
}
//
// Initialize new parent field
//
this.type = "Human";
}
private static final long serialVersionUID = 1L;
String first;
String last;
Integer age;
}
Running the upgrade utility on the old and new
Person classes generates this output:
java -jar upgrade.jar current=original replacement=dist
1427 classes processed in 0.088 seconds.
Possible problems:
==================
com.kabira.snippets.upgrade.Animal
Not found in the current JAR files. If this is a
new class, this is not a problem. If this is not a
new class, the class cannot be found in the current
JAR files and must be provided.
Changed classes:
================
Name: com.kabira.snippets.upgrade.Person
Current serialVerisonUID: Not Set
Replacement serialVersionUID: 1
Mismatch handling: Application
Transparent changes:
Removed field name.
Added field last.
Added field first.
Non-transparent changes:
Inheritance modified.
Type of field age changed.
Generated upgrade file: upgrade.111122The possible problems section indicates that the
com.kabira.snippets.upgrade.Animal class was not found
in the previous version. This is expected because this is a new class. The
upgrade utility reports this as a possible problem because it cannot
differentiate between a new class, or one that was not provided in the
current JAR files.