You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by Burton Rhodes <bu...@gmail.com> on 2021/08/11 12:49:51 UTC

How to implement custom StrutsTypeConverter to convert String to Collection?

I have a html form input that submits a string value that needs to be
converted to a java Collection (a Set object in this case).  Specifically
the input key/value is: viewTasksFilter.taskStatuses="[OPEN,COMPLETE]".
 In the "viewTaskFilter" object, "taskStatuses" is defined as a Set with
enum values (Set<TaskStatus> taskStatuses).  The custom converter below
does convert the input form value to a Set, however it is a Set<String>
(not Set<TaskStatus>).  This is an issue because the Struts Action member
variable "viewTasksFilter.taskStatuses" now contains a Set of the wrong
type.  Since I will have other variables that need this logic, I would
prefer not to hardcode the Set<TaskStatus> in this converter.  Is there a
way to use existing Struts "converter code" to convert the Set<String> to
the appropriate Set<Object>?  I know the built-in Struts converters already
do this, but I am unable to figure out how to do this in a custom
converter.  Is this possible?  Or is this even the right way to solve this
issue?  Any help is appreciated!


/**
 * Converter class to convert comma separated string to a collection
 */
public class MyStringToCollectionConverter extends StrutsTypeConverter {

    @Override
    public Object convertFromString(Map context, String[] values, Class
toClass) {

        String s = values[0];
        String temp = s.replaceAll("[\\[\\]\"']", "");
        List<String> cleanedValues = Arrays.stream(temp.split(","))
                .map(String::trim)
                .collect(Collectors.toList());

        if (toClass == Set.class) {
            try {
                if (cleanedValues.size() == 0) {
                    return null;
                } else {
                    return new HashSet<>(cleanedValues);
                }
            } catch (Exception e) {
                throw new TypeConversionException("Could not parse to Set
class:" + Arrays.toString(values));
            }

        } else if (toClass == List.class) {
            try {
                if (cleanedValues.size() == 0) {
                    return null;
                } else {
                    return cleanedValues;
                }
            } catch (Exception e) {
                throw new TypeConversionException("Could not parse to List
class:" + Arrays.toString(values));
            }

        }

        return null;
    }

    @Override
    public String convertToString(Map context, Object o) {
        if (o == null) {
            return null;
        } else {
            return o.toString();
        }
    }
}

Re: How to implement custom StrutsTypeConverter to convert String to Collection?

Posted by Zahid Rahman <za...@gmail.com>.
 >> I've spent the better part of a day in the debugger, but ultimately
figured
it out.

you're bill-able.
Put it on the time sheet.  :)


zahid
https://www.backbutton.org

¯\_(ツ)_/¯
♡۶♡۶ ♡۶


On Fri, 13 Aug 2021, 12:15 Martin Gainty, <mg...@hotmail.com> wrote:

> Assuming you can locate Struts version which supports CollectionConverter
> and implementor DefaultTypeConverter codebase
>
> You will of course need to code at least one testcase to make sure
> MyStringToCollectionConverter works
>
> Once testcase is coded and works
> can you submit MyStringToCollectionConverter and TestCase  as Struts patch
> to CollectionConverter code base?
>
> Thanks Burton!
> M-
>
> ________________________________
> From: Burton Rhodes <bu...@gmail.com>
> Sent: Thursday, August 12, 2021 9:07 AM
> To: Struts Users Mailing List <us...@struts.apache.org>
> Subject: Re: How to implement custom StrutsTypeConverter to convert String
> to Collection?
>
> Thanks Zahid -
> I've spent the better part of a day in the debugger, but ultimately figured
> it out.  Essentially, I first needed to use the DefaultTypeConverter to
> parse the individual elements, then use the CollectionConverter to place
> the elements into the final Collection needed for the Action.  In case
> anyone is interested, here is my final code that converts a comma separated
> string into a collection using a custom Struts type converter:
>
> /**
>  * Converter class to convert comma separated string to a collection
> *   (e.g. form input value of "[a,b,c]" -> Set<AnyClass>())
>  */
> public class MyStringToCollectionConverter extends DefaultTypeConverter {
>
>     private ObjectTypeDeterminer objectTypeDeterminer;
>
>     @Inject
>     public void setObjectTypeDeterminer(ObjectTypeDeterminer determiner) {
>         this.objectTypeDeterminer = determiner;
>     }
>
>     @Override
>     public Object convertValue(Map<String, Object> context, Object target,
> Member member, String propertyName, Object value, Class toType) {
>
>         // Clean up and parse values into []
>         String s = ((String[]) value)[0];
>         String temp = s.replaceAll("[\\[\\]\"']", "");
>         String[] cleanedValues = Arrays.stream(temp.split(","))
>                 .map(String::trim)
>                 .filter(StringUtils::isNotBlank)
>                 .toArray(String[]::new);
>
>         // Convert values into an Object[] of "memberType"
>         Class<?> memberType =
> objectTypeDeterminer.getElementClass(target.getClass(), propertyName,
> null);
>         Object[] convertedValues = Arrays.stream(cleanedValues)
>                 .map(val -> convertValue(val, memberType))
>                 .toArray();
>
>         // Use CollectionConverter to convert values into the expected
> collection
>         CollectionConverter collectionConverter = new
> CollectionConverter();
>         collectionConverter.setObjectTypeDeterminer(objectTypeDeterminer);
>         return collectionConverter.convertValue(context, target, member,
> propertyName, convertedValues, toType);
>     }
> }
>
>
> On Wed, Aug 11, 2021 at 6:49 PM Zahid Rahman <za...@gmail.com> wrote:
>
> >   > I have a html form input that submits a string value that needs to be
> > converted to a java Collection.
> >
> > To find the bug in logic
> > I would  hard code a string which is expected  from html input form.
> >
> > Using an IDE .
> >
> > Set a break point there to go into debug mode.
> >
> > Step through the code one step at a time.
> > Watch the string values changes
> > In the debug window.
> > Then you can see  the  data values change as expected or not at each
> step.
> >
> >
> >
> >
> > zahid
> >
> >
> >
> > https://www.backbutton.org
> >
> > ¯\_(ツ)_/¯
> > ♡۶♡۶ ♡۶
> >
> >
> > On Wed, 11 Aug 2021, 13:50 Burton Rhodes, <bu...@gmail.com>
> wrote:
> >
> > > I have a html form input that submits a string value that needs to be
> > > converted to a java Collection (a Set object in this case).
> Specifically
> > > the input key/value is: viewTasksFilter.taskStatuses="[OPEN,COMPLETE]".
> > >  In the "viewTaskFilter" object, "taskStatuses" is defined as a Set
> with
> > > enum values (Set<TaskStatus> taskStatuses).  The custom converter below
> > > does convert the input form value to a Set, however it is a Set<String>
> > > (not Set<TaskStatus>).  This is an issue because the Struts Action
> member
> > > variable "viewTasksFilter.taskStatuses" now contains a Set of the wrong
> > > type.  Since I will have other variables that need this logic, I would
> > > prefer not to hardcode the Set<TaskStatus> in this converter.  Is
> there a
> > > way to use existing Struts "converter code" to convert the Set<String>
> to
> > > the appropriate Set<Object>?  I know the built-in Struts converters
> > already
> > > do this, but I am unable to figure out how to do this in a custom
> > > converter.  Is this possible?  Or is this even the right way to solve
> > this
> > > issue?  Any help is appreciated!
> > >
> > >
> > > /**
> > >  * Converter class to convert comma separated string to a collection
> > >  */
> > > public class MyStringToCollectionConverter extends StrutsTypeConverter
> {
> > >
> > >     @Override
> > >     public Object convertFromString(Map context, String[] values, Class
> > > toClass) {
> > >
> > >         String s = values[0];
> > >         String temp = s.replaceAll("[\\[\\]\"']", "");
> > >         List<String> cleanedValues = Arrays.stream(temp.split(","))
> > >                 .map(String::trim)
> > >                 .collect(Collectors.toList());
> > >
> > >         if (toClass == Set.class) {
> > >             try {
> > >                 if (cleanedValues.size() == 0) {
> > >                     return null;
> > >                 } else {
> > >                     return new HashSet<>(cleanedValues);
> > >                 }
> > >             } catch (Exception e) {
> > >                 throw new TypeConversionException("Could not parse to
> Set
> > > class:" + Arrays.toString(values));
> > >             }
> > >
> > >         } else if (toClass == List.class) {
> > >             try {
> > >                 if (cleanedValues.size() == 0) {
> > >                     return null;
> > >                 } else {
> > >                     return cleanedValues;
> > >                 }
> > >             } catch (Exception e) {
> > >                 throw new TypeConversionException("Could not parse to
> > List
> > > class:" + Arrays.toString(values));
> > >             }
> > >
> > >         }
> > >
> > >         return null;
> > >     }
> > >
> > >     @Override
> > >     public String convertToString(Map context, Object o) {
> > >         if (o == null) {
> > >             return null;
> > >         } else {
> > >             return o.toString();
> > >         }
> > >     }
> > > }
> > >
> >
>
>

Re: How to implement custom StrutsTypeConverter to convert String to Collection?

Posted by Martin Gainty <mg...@hotmail.com>.
Assuming you can locate Struts version which supports CollectionConverter and implementor DefaultTypeConverter codebase

You will of course need to code at least one testcase to make sure MyStringToCollectionConverter works

Once testcase is coded and works
can you submit MyStringToCollectionConverter and TestCase  as Struts patch to CollectionConverter code base?

Thanks Burton!
M-

________________________________
From: Burton Rhodes <bu...@gmail.com>
Sent: Thursday, August 12, 2021 9:07 AM
To: Struts Users Mailing List <us...@struts.apache.org>
Subject: Re: How to implement custom StrutsTypeConverter to convert String to Collection?

Thanks Zahid -
I've spent the better part of a day in the debugger, but ultimately figured
it out.  Essentially, I first needed to use the DefaultTypeConverter to
parse the individual elements, then use the CollectionConverter to place
the elements into the final Collection needed for the Action.  In case
anyone is interested, here is my final code that converts a comma separated
string into a collection using a custom Struts type converter:

/**
 * Converter class to convert comma separated string to a collection
*   (e.g. form input value of "[a,b,c]" -> Set<AnyClass>())
 */
public class MyStringToCollectionConverter extends DefaultTypeConverter {

    private ObjectTypeDeterminer objectTypeDeterminer;

    @Inject
    public void setObjectTypeDeterminer(ObjectTypeDeterminer determiner) {
        this.objectTypeDeterminer = determiner;
    }

    @Override
    public Object convertValue(Map<String, Object> context, Object target,
Member member, String propertyName, Object value, Class toType) {

        // Clean up and parse values into []
        String s = ((String[]) value)[0];
        String temp = s.replaceAll("[\\[\\]\"']", "");
        String[] cleanedValues = Arrays.stream(temp.split(","))
                .map(String::trim)
                .filter(StringUtils::isNotBlank)
                .toArray(String[]::new);

        // Convert values into an Object[] of "memberType"
        Class<?> memberType =
objectTypeDeterminer.getElementClass(target.getClass(), propertyName, null);
        Object[] convertedValues = Arrays.stream(cleanedValues)
                .map(val -> convertValue(val, memberType))
                .toArray();

        // Use CollectionConverter to convert values into the expected
collection
        CollectionConverter collectionConverter = new CollectionConverter();
        collectionConverter.setObjectTypeDeterminer(objectTypeDeterminer);
        return collectionConverter.convertValue(context, target, member,
propertyName, convertedValues, toType);
    }
}


On Wed, Aug 11, 2021 at 6:49 PM Zahid Rahman <za...@gmail.com> wrote:

>   > I have a html form input that submits a string value that needs to be
> converted to a java Collection.
>
> To find the bug in logic
> I would  hard code a string which is expected  from html input form.
>
> Using an IDE .
>
> Set a break point there to go into debug mode.
>
> Step through the code one step at a time.
> Watch the string values changes
> In the debug window.
> Then you can see  the  data values change as expected or not at each step.
>
>
>
>
> zahid
>
>
>
> https://www.backbutton.org
>
> ¯\_(ツ)_/¯
> ♡۶♡۶ ♡۶
>
>
> On Wed, 11 Aug 2021, 13:50 Burton Rhodes, <bu...@gmail.com> wrote:
>
> > I have a html form input that submits a string value that needs to be
> > converted to a java Collection (a Set object in this case).  Specifically
> > the input key/value is: viewTasksFilter.taskStatuses="[OPEN,COMPLETE]".
> >  In the "viewTaskFilter" object, "taskStatuses" is defined as a Set with
> > enum values (Set<TaskStatus> taskStatuses).  The custom converter below
> > does convert the input form value to a Set, however it is a Set<String>
> > (not Set<TaskStatus>).  This is an issue because the Struts Action member
> > variable "viewTasksFilter.taskStatuses" now contains a Set of the wrong
> > type.  Since I will have other variables that need this logic, I would
> > prefer not to hardcode the Set<TaskStatus> in this converter.  Is there a
> > way to use existing Struts "converter code" to convert the Set<String> to
> > the appropriate Set<Object>?  I know the built-in Struts converters
> already
> > do this, but I am unable to figure out how to do this in a custom
> > converter.  Is this possible?  Or is this even the right way to solve
> this
> > issue?  Any help is appreciated!
> >
> >
> > /**
> >  * Converter class to convert comma separated string to a collection
> >  */
> > public class MyStringToCollectionConverter extends StrutsTypeConverter {
> >
> >     @Override
> >     public Object convertFromString(Map context, String[] values, Class
> > toClass) {
> >
> >         String s = values[0];
> >         String temp = s.replaceAll("[\\[\\]\"']", "");
> >         List<String> cleanedValues = Arrays.stream(temp.split(","))
> >                 .map(String::trim)
> >                 .collect(Collectors.toList());
> >
> >         if (toClass == Set.class) {
> >             try {
> >                 if (cleanedValues.size() == 0) {
> >                     return null;
> >                 } else {
> >                     return new HashSet<>(cleanedValues);
> >                 }
> >             } catch (Exception e) {
> >                 throw new TypeConversionException("Could not parse to Set
> > class:" + Arrays.toString(values));
> >             }
> >
> >         } else if (toClass == List.class) {
> >             try {
> >                 if (cleanedValues.size() == 0) {
> >                     return null;
> >                 } else {
> >                     return cleanedValues;
> >                 }
> >             } catch (Exception e) {
> >                 throw new TypeConversionException("Could not parse to
> List
> > class:" + Arrays.toString(values));
> >             }
> >
> >         }
> >
> >         return null;
> >     }
> >
> >     @Override
> >     public String convertToString(Map context, Object o) {
> >         if (o == null) {
> >             return null;
> >         } else {
> >             return o.toString();
> >         }
> >     }
> > }
> >
>

Re: How to implement custom StrutsTypeConverter to convert String to Collection?

Posted by Burton Rhodes <bu...@gmail.com>.
Thanks Zahid -
I've spent the better part of a day in the debugger, but ultimately figured
it out.  Essentially, I first needed to use the DefaultTypeConverter to
parse the individual elements, then use the CollectionConverter to place
the elements into the final Collection needed for the Action.  In case
anyone is interested, here is my final code that converts a comma separated
string into a collection using a custom Struts type converter:

/**
 * Converter class to convert comma separated string to a collection
*   (e.g. form input value of "[a,b,c]" -> Set<AnyClass>())
 */
public class MyStringToCollectionConverter extends DefaultTypeConverter {

    private ObjectTypeDeterminer objectTypeDeterminer;

    @Inject
    public void setObjectTypeDeterminer(ObjectTypeDeterminer determiner) {
        this.objectTypeDeterminer = determiner;
    }

    @Override
    public Object convertValue(Map<String, Object> context, Object target,
Member member, String propertyName, Object value, Class toType) {

        // Clean up and parse values into []
        String s = ((String[]) value)[0];
        String temp = s.replaceAll("[\\[\\]\"']", "");
        String[] cleanedValues = Arrays.stream(temp.split(","))
                .map(String::trim)
                .filter(StringUtils::isNotBlank)
                .toArray(String[]::new);

        // Convert values into an Object[] of "memberType"
        Class<?> memberType =
objectTypeDeterminer.getElementClass(target.getClass(), propertyName, null);
        Object[] convertedValues = Arrays.stream(cleanedValues)
                .map(val -> convertValue(val, memberType))
                .toArray();

        // Use CollectionConverter to convert values into the expected
collection
        CollectionConverter collectionConverter = new CollectionConverter();
        collectionConverter.setObjectTypeDeterminer(objectTypeDeterminer);
        return collectionConverter.convertValue(context, target, member,
propertyName, convertedValues, toType);
    }
}


On Wed, Aug 11, 2021 at 6:49 PM Zahid Rahman <za...@gmail.com> wrote:

>   > I have a html form input that submits a string value that needs to be
> converted to a java Collection.
>
> To find the bug in logic
> I would  hard code a string which is expected  from html input form.
>
> Using an IDE .
>
> Set a break point there to go into debug mode.
>
> Step through the code one step at a time.
> Watch the string values changes
> In the debug window.
> Then you can see  the  data values change as expected or not at each step.
>
>
>
>
> zahid
>
>
>
> https://www.backbutton.org
>
> ¯\_(ツ)_/¯
> ♡۶♡۶ ♡۶
>
>
> On Wed, 11 Aug 2021, 13:50 Burton Rhodes, <bu...@gmail.com> wrote:
>
> > I have a html form input that submits a string value that needs to be
> > converted to a java Collection (a Set object in this case).  Specifically
> > the input key/value is: viewTasksFilter.taskStatuses="[OPEN,COMPLETE]".
> >  In the "viewTaskFilter" object, "taskStatuses" is defined as a Set with
> > enum values (Set<TaskStatus> taskStatuses).  The custom converter below
> > does convert the input form value to a Set, however it is a Set<String>
> > (not Set<TaskStatus>).  This is an issue because the Struts Action member
> > variable "viewTasksFilter.taskStatuses" now contains a Set of the wrong
> > type.  Since I will have other variables that need this logic, I would
> > prefer not to hardcode the Set<TaskStatus> in this converter.  Is there a
> > way to use existing Struts "converter code" to convert the Set<String> to
> > the appropriate Set<Object>?  I know the built-in Struts converters
> already
> > do this, but I am unable to figure out how to do this in a custom
> > converter.  Is this possible?  Or is this even the right way to solve
> this
> > issue?  Any help is appreciated!
> >
> >
> > /**
> >  * Converter class to convert comma separated string to a collection
> >  */
> > public class MyStringToCollectionConverter extends StrutsTypeConverter {
> >
> >     @Override
> >     public Object convertFromString(Map context, String[] values, Class
> > toClass) {
> >
> >         String s = values[0];
> >         String temp = s.replaceAll("[\\[\\]\"']", "");
> >         List<String> cleanedValues = Arrays.stream(temp.split(","))
> >                 .map(String::trim)
> >                 .collect(Collectors.toList());
> >
> >         if (toClass == Set.class) {
> >             try {
> >                 if (cleanedValues.size() == 0) {
> >                     return null;
> >                 } else {
> >                     return new HashSet<>(cleanedValues);
> >                 }
> >             } catch (Exception e) {
> >                 throw new TypeConversionException("Could not parse to Set
> > class:" + Arrays.toString(values));
> >             }
> >
> >         } else if (toClass == List.class) {
> >             try {
> >                 if (cleanedValues.size() == 0) {
> >                     return null;
> >                 } else {
> >                     return cleanedValues;
> >                 }
> >             } catch (Exception e) {
> >                 throw new TypeConversionException("Could not parse to
> List
> > class:" + Arrays.toString(values));
> >             }
> >
> >         }
> >
> >         return null;
> >     }
> >
> >     @Override
> >     public String convertToString(Map context, Object o) {
> >         if (o == null) {
> >             return null;
> >         } else {
> >             return o.toString();
> >         }
> >     }
> > }
> >
>

Re: How to implement custom StrutsTypeConverter to convert String to Collection?

Posted by Zahid Rahman <za...@gmail.com>.
  > I have a html form input that submits a string value that needs to be
converted to a java Collection.

To find the bug in logic
I would  hard code a string which is expected  from html input form.

Using an IDE .

Set a break point there to go into debug mode.

Step through the code one step at a time.
Watch the string values changes
In the debug window.
Then you can see  the  data values change as expected or not at each step.




zahid



https://www.backbutton.org

¯\_(ツ)_/¯
♡۶♡۶ ♡۶


On Wed, 11 Aug 2021, 13:50 Burton Rhodes, <bu...@gmail.com> wrote:

> I have a html form input that submits a string value that needs to be
> converted to a java Collection (a Set object in this case).  Specifically
> the input key/value is: viewTasksFilter.taskStatuses="[OPEN,COMPLETE]".
>  In the "viewTaskFilter" object, "taskStatuses" is defined as a Set with
> enum values (Set<TaskStatus> taskStatuses).  The custom converter below
> does convert the input form value to a Set, however it is a Set<String>
> (not Set<TaskStatus>).  This is an issue because the Struts Action member
> variable "viewTasksFilter.taskStatuses" now contains a Set of the wrong
> type.  Since I will have other variables that need this logic, I would
> prefer not to hardcode the Set<TaskStatus> in this converter.  Is there a
> way to use existing Struts "converter code" to convert the Set<String> to
> the appropriate Set<Object>?  I know the built-in Struts converters already
> do this, but I am unable to figure out how to do this in a custom
> converter.  Is this possible?  Or is this even the right way to solve this
> issue?  Any help is appreciated!
>
>
> /**
>  * Converter class to convert comma separated string to a collection
>  */
> public class MyStringToCollectionConverter extends StrutsTypeConverter {
>
>     @Override
>     public Object convertFromString(Map context, String[] values, Class
> toClass) {
>
>         String s = values[0];
>         String temp = s.replaceAll("[\\[\\]\"']", "");
>         List<String> cleanedValues = Arrays.stream(temp.split(","))
>                 .map(String::trim)
>                 .collect(Collectors.toList());
>
>         if (toClass == Set.class) {
>             try {
>                 if (cleanedValues.size() == 0) {
>                     return null;
>                 } else {
>                     return new HashSet<>(cleanedValues);
>                 }
>             } catch (Exception e) {
>                 throw new TypeConversionException("Could not parse to Set
> class:" + Arrays.toString(values));
>             }
>
>         } else if (toClass == List.class) {
>             try {
>                 if (cleanedValues.size() == 0) {
>                     return null;
>                 } else {
>                     return cleanedValues;
>                 }
>             } catch (Exception e) {
>                 throw new TypeConversionException("Could not parse to List
> class:" + Arrays.toString(values));
>             }
>
>         }
>
>         return null;
>     }
>
>     @Override
>     public String convertToString(Map context, Object o) {
>         if (o == null) {
>             return null;
>         } else {
>             return o.toString();
>         }
>     }
> }
>

Re: How to implement custom StrutsTypeConverter to convert String to Collection?

Posted by Burton Rhodes <bu...@gmail.com>.
I also attempted to extend the DefaultTypeConverter (instead of the
StrutsTypeConverter) and override one of the convertValue() methods to try
to reuse existing Struts code.  Although the code below gives no errors,
ultimately, the target object (viewTasksFilter.taskStatuses) is not set (it
remains null).  Again, any suggestions are welcome.  Thanks!

/**
 * Converter class to convert comma separated string to a collection
 */
public class MyStringToCollectionConverter extends DefaultTypeConverter {

    @Override
    public Object convertValue(Map<String, Object> context, Object target,
Member member, String propertyName, Object value, Class toType) {

        // Convert value to "cleaned" String[]
        String s = ((String[]) value)[0];
        String temp = s.replaceAll("[\\[\\]\"']", "");
        String[] cleanedValues = Arrays.stream(temp.split(","))
                .map(String::trim)
                .filter(StringUtils::isNotBlank)
                .toArray(String[]::new);

        // Use the member variable to discover the type of object in the
target collection
        Class<?> valueClass;
        try {
            Type[] types = ((Method) member).getGenericParameterTypes();
            ParameterizedType pType = (ParameterizedType) types[0];
            valueClass = (Class<?>) pType.getActualTypeArguments()[0];
        } catch (Exception e) {
            valueClass = String.class;
        }

        // Convert cleanedValues into a collection of "valueClass" objects
        List<Object> convertedValues = new ArrayList<>();
        for (String val : cleanedValues) {
            convertedValues.add(convertValue(val, valueClass));
        }

        return super.convertValue(context, target, member, propertyName,
convertedValues.toArray(), toType);
    }
}

On Wed, Aug 11, 2021 at 7:49 AM Burton Rhodes <bu...@gmail.com>
wrote:

> I have a html form input that submits a string value that needs to be
> converted to a java Collection (a Set object in this case).  Specifically
> the input key/value is: viewTasksFilter.taskStatuses="[OPEN,COMPLETE]".
>  In the "viewTaskFilter" object, "taskStatuses" is defined as a Set with
> enum values (Set<TaskStatus> taskStatuses).  The custom converter below
> does convert the input form value to a Set, however it is a Set<String>
> (not Set<TaskStatus>).  This is an issue because the Struts Action member
> variable "viewTasksFilter.taskStatuses" now contains a Set of the wrong
> type.  Since I will have other variables that need this logic, I would
> prefer not to hardcode the Set<TaskStatus> in this converter.  Is there a
> way to use existing Struts "converter code" to convert the Set<String> to
> the appropriate Set<Object>?  I know the built-in Struts converters already
> do this, but I am unable to figure out how to do this in a custom
> converter.  Is this possible?  Or is this even the right way to solve this
> issue?  Any help is appreciated!
>
>
> /**
>  * Converter class to convert comma separated string to a collection
>  */
> public class MyStringToCollectionConverter extends StrutsTypeConverter {
>
>     @Override
>     public Object convertFromString(Map context, String[] values, Class
> toClass) {
>
>         String s = values[0];
>         String temp = s.replaceAll("[\\[\\]\"']", "");
>         List<String> cleanedValues = Arrays.stream(temp.split(","))
>                 .map(String::trim)
>                 .collect(Collectors.toList());
>
>         if (toClass == Set.class) {
>             try {
>                 if (cleanedValues.size() == 0) {
>                     return null;
>                 } else {
>                     return new HashSet<>(cleanedValues);
>                 }
>             } catch (Exception e) {
>                 throw new TypeConversionException("Could not parse to Set
> class:" + Arrays.toString(values));
>             }
>
>         } else if (toClass == List.class) {
>             try {
>                 if (cleanedValues.size() == 0) {
>                     return null;
>                 } else {
>                     return cleanedValues;
>                 }
>             } catch (Exception e) {
>                 throw new TypeConversionException("Could not parse to List
> class:" + Arrays.toString(values));
>             }
>
>         }
>
>         return null;
>     }
>
>     @Override
>     public String convertToString(Map context, Object o) {
>         if (o == null) {
>             return null;
>         } else {
>             return o.toString();
>         }
>     }
> }
>