Sometimes it is just simpler to move to a new implementation class
entirely. You keep Just Enoughâ„¢ of the old class around that it can be read
from disk... and then you add a `readResolve` method that instantiates and
returns the new class

Here is a very old example of doing this for a complex migration:
https://github.com/jenkinsci/cloudbees-deployer-plugin/blob/master/src/main/java/org/jenkins/plugins/cloudbees/CloudbeesPublisher.java#L102

On 14 June 2017 at 23:59, Christian McHugh <christian.mch...@gmail.com>
wrote:

> Greetings community,
>
> Earlier versions of the saltstack plugin were pretty ugly and didn't use a
> class for the different options in a dropdown selector, but instead just
> parsed the json in the databoundconstructor. Thankfully, this has been
> corrected, but now brings up the issue of how to support older configs.
>
> I have the following code added to readResolve() or
> public static class ConverterImpl extends XStream2.PassthruConverter<Sal
> tAPIBuilder> {
>     public ConverterImpl(XStream2 xstream) { super(xstream); }
>     @Override
>     protected void callback(SaltAPIBuilder obj, UnmarshallingContext
> context) {
>
>         // Support 1.7 and before
>         if (obj.clientInterfaces != null) {
>             obj.arguments = obj.arguments.replaceAll(",", " ");
>             if (obj.clientInterfaces.has("clientInterface")) {
>                 if (obj.clientInterfaces.getString("clientInterface").
> equals("local")) {
>                     obj.clientInterface = new LocalClient(obj.function,
> obj.arguments + " " + obj.kwarguments, obj.target, obj.targettype);
>                     ((LocalClient) obj.clientInterface).setJobPollTime(obj
> .clientInterfaces.getInt("jobPollTime"));
>                     ((LocalClient) obj.clientInterface).setBlockbuild(obj.
> clientInterfaces.getBoolean("blockbuild"));
>                 } else if (obj.clientInterfaces.getString(
> "clientInterface").equals("local_batch")) {
>                     obj.clientInterface = new LocalBatchClient(obj.
> function, obj.arguments + " " + obj.kwarguments, obj.batchSize, obj.target
> , obj.targettype);
>                 } else if (obj.clientInterfaces.getString(
> "clientInterface").equals("runner")) {
>                     obj.clientInterface = new RunnerClient(obj.function,
> obj.arguments + " " + obj.kwarguments, obj.mods, obj.pillarvalue);
>                 }
>             }
>             final XStream xStream = new XStream(new DomDriver());
>             final String xmlResult = xStream.toXML(obj).toString();
>             System.out.println("!!!!!! Running ConverterImpl\n" +
> xmlResult);
>
>             OldDataMonitor.report(context, "1.7.2");
>        }
>     }
> }
> This code attempts to parse the old format, and creates the appropriate
> new classes. In the above, the system.out.println result shows the expected
> output, but unfortunately there's a problem.
> When viewing a job with an older config, nothing is displayed. When
> viewing the manage old data page the following error is shown:
> TypeNameVersion
> hudson.model.FreeStyleProject job1.7.1 1.7.2 ConversionException: Cannot
> construct com.waytta.clientinterface.BasicClient :
> com.waytta.clientinterface.BasicClient : Cannot construct
> com.waytta.clientinterface.BasicClient : 
> com.waytta.clientinterface.BasicClient
> ---- Debugging information ---- message : Cannot construct
> com.waytta.clientinterface.BasicClient : 
> com.waytta.clientinterface.BasicClient
> cause-exception : 
> com.thoughtworks.xstream.converters.reflection.ObjectAccessException
> cause-message : Cannot construct com.waytta.clientinterface.BasicClient :
> com.waytta.clientinterface.BasicClient class : 
> com.waytta.clientinterface.BasicClient
> required-type : com.waytta.clientinterface.BasicClient converter-type :
> hudson.util.RobustReflectionConverter path : 
> /project/builders/com.waytta.SaltAPIBuilder/clientInterface
> line number : 52 -------------------------------, InstantiationError: null
>
> Does anyone have a recomendation on how to support this migration and
> creating a class from the ConverterImpl?
> Thanks :)
>
> --
> You received this message because you are subscribed to the Google Groups
> "Jenkins Developers" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to jenkinsci-dev+unsubscr...@googlegroups.com.
> To view this discussion on the web visit https://groups.google.com/d/
> msgid/jenkinsci-dev/3825faa2-a769-4a81-9c92-dc0065dea0c8%
> 40googlegroups.com
> <https://groups.google.com/d/msgid/jenkinsci-dev/3825faa2-a769-4a81-9c92-dc0065dea0c8%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Jenkins Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to jenkinsci-dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jenkinsci-dev/CA%2BnPnMxVns_8g51nbB-YV3Qs3eFwS7TuCjYbQsVNaX2XO8r36w%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to