I made a little test case.  To isolate things to just how array-valued
parameters are programmatically set and accessed, I used a dummy annotator from
the uimaj-examples project called the "RoomNumberAnnotator" - the version I used
has no "initialize" of its own (so it didn't do anything in its initialize 
method).

Then I did the following "driver" code, modelled after your code, except I only
did one parameter - the string array valued p1:

   public static void main(String[] args) throws 
ResourceInitializationException {

    AnalysisEngineDescription_impl primitiveDesc = new
AnalysisEngineDescription_impl();
 
    primitiveDesc.setPrimitive(true);
 
    primitiveDesc.getMetaData().setName("test of setting string array 
parameters");
 
   
primitiveDesc.setAnnotatorImplementationName("org.apache.uima.tutorial.ex1.RoomNumberAnnotator");
 
    ConfigurationParameter p1 = new ConfigurationParameter_impl();
   
    p1.setMultiValued(true);  // needed to have this parameter take an array of
values
 
    p1.setName("AttributeList");
 
    p1.setDescription("Attribute List");
 
    p1.setType(ConfigurationParameter.TYPE_STRING); // This specifies the type
of each element of the array
   
   
primitiveDesc.getMetaData().getConfigurationParameterDeclarations().setConfigurationParameters(
        new ConfigurationParameter[] { p1 });

    // This sets the configuration parameter to a value which is an array of
Strings, "v1" and "v2"
   
primitiveDesc.getMetaData().getConfigurationParameterSettings().setParameterSettings(
       new NameValuePair[] {
           new NameValuePair_impl("AttributeList", new String[] {"v1", "v2"})} 
);

    TypeSystemDescription typeSystem = new TypeSystemDescription_impl();

    primitiveDesc.getAnalysisEngineMetaData().setTypeSystem(typeSystem);
   
    // For testing - make an UIMA Analysis Engine from this specification
    AnalysisEngine ae = UIMAFramework.produceAnalysisEngine(primitiveDesc);
   
    // Get the UIMA Context from where we can try getting the configuration
parameter settings
    UimaContext context = ae.getUimaContext();
   
    // Get the configured value
    Object v = context.getConfigParameterValue("AttributeList");
   
    System.out.format("Type of object returned is %s, object is %s%n",
v.getClass(), v) ;
   
    // print out the individual strings in the array
    String[] av = (String[]) v;
   
    System.out.format("The two values are %s and %s%n", av[0], av[1]);
  }

I ran this and it printed out:

Type of object returned is class [Ljava.lang.String;, object is
[Ljava.lang.String;@45a36ab6
The two values are v1 and v2.

No errors were thrown.

Hope that example helps.

-Marshall

On 5/22/2013 11:08 AM, harshal patni wrote:
> Yes I did! When I do that it throws the following error -
> It throws a cast error stating Type String cannot be converted to String
> array.
>
> Harshal
>
>
> On Wed, May 22, 2013 at 8:03 PM, Marshall Schor <m...@schor.com> wrote:
>
>> did you have the multi-values setting turned on in the parameter
>> specification?
>>
>>
>> On 5/22/2013 10:15 AM, harshal patni wrote:
>>> Hi Marshall,
>>>                 Thank you for your response. Yes I tried setting and
>> array
>>> as a second argument of NameValuePair_Impl. However it throws an error
>>> since the setType() has only 4 options (String, Boolean, Float,
>> Integer). I
>>> had to set it to string forcibly, coz if I dont UIMA by default sets it
>> to
>>> NULL which again causes an error.
>>>
>>> Harshal
>>>
>>>
>>> On Wed, May 22, 2013 at 7:33 PM, Marshall Schor <m...@schor.com> wrote:
>>>
>>>> most likely this is a problem in building the parameter setting.
>>>>
>>>> I did one of these using the Eclipse editor for UIMA XML files, and
>> looked
>>>> at
>>>> what it generated as the setting:
>>>>
>>>>     <configurationParameterSettings>
>>>>       <nameValuePair>
>>>>         <name>astringarray</name>
>>>>         <value>
>>>>           <array>
>>>>             <string>x1</string>
>>>>             <string>x2</string>
>>>>           </array>
>>>>         </value>
>>>>       </nameValuePair>
>>>>     </configurationParameterSettings>
>>>>
>>>> Have you tried creating NameValuePair_impl instances, with arrays as the
>>>> 2nd
>>>> argument (i.e., the "value")?
>>>>
>>>> for instance:
>>>>    ... new NameValuePair_impl("AttributeList", new String[] {"value1",
>>>> "value2",
>>>> ...}) ...
>>>>
>>>> -Marshall
>>>>
>>>>
>>>> On 5/21/2013 11:34 PM, harshal patni wrote:
>>>>> Hello Himanshu,
>>>>>                        I tried setting the setMultivalues(true). The
>>>>> problem is the following -
>>>>> I use setType (String). I need to do this coz else it takes it as null.
>>>> But
>>>>> as soon as we setType(String) it throws a cast error saying string
>> cannot
>>>>> be cast to a String array. If you look at the source code of
>>>> conceptMapper
>>>>> it tried to cast in code.
>>>>>
>>>>> Hope that makes sense..
>>>>> Any idea how this could be resolved?
>>>>> Please also add code snippet to make it easier to understand.
>>>>>
>>>>> Thanks,
>>>>> Harshal
>>>>>
>>>>>
>>>>> On Wed, May 22, 2013 at 1:34 AM, Himanshu Gahlot <
>>>>> himanshu.gahlo...@gmail.com> wrote:
>>>>>
>>>>>> Use setMultiValued()<
>>>>>>
>> http://uima.apache.org/downloads/releaseDocs/2.3.0-incubating/docs/api/org/apache/uima/resource/metadata/ConfigurationParameter.html#setMultiValued%28boolean%29
>>>>>>> .
>>>>>> So, p1.setMultiValued() should make this config param accept multiple
>>>>>> String values.
>>>>>>
>>>>>> Himanshu
>>>>>>
>>>>>>
>>>>>> On Tue, May 21, 2013 at 1:10 AM, Renaud Richardet
>>>>>> <renaud.richar...@epfl.ch>wrote:
>>>>>>
>>>>>>> Hi Harshal,
>>>>>>> Have you tried UimaFit? I think it would be a better option, if you
>> do
>>>>>> not
>>>>>>> want to use XML descriptors.
>>>>>>> Hope that helps, Renaud
>>>>>>>
>>>>>>>
>>>>>>> On Tue, May 21, 2013 at 8:49 AM, harshal patni <
>>>> patni.hars...@gmail.com
>>>>>>>> wrote:
>>>>>>>> Hello Everyone,
>>>>>>>>                    I am currently writing ConceptMapper in code (not
>>>>>>> using
>>>>>>>> XML files). Basically I am definitely AnalysisEngineDescriptions and
>>>>>>>> TypeSystem Description in java code. I create the following 2
>>>>>> parameters
>>>>>>>> using "ConfigurationParameter" class.
>>>>>>>>
>>>>>>>>    1. AttributeList
>>>>>>>>    2. FeatureList
>>>>>>>>
>>>>>>>> The problem is both these should be arrays. But
>> ConfigurationParameter
>>>>>>> only
>>>>>>>> provide the  following types (String, Boolean, Integer, Float).
>> When I
>>>>>>> pass
>>>>>>>> these values as string it fails and throws a
>>>>>> java.lang.ClassCastException
>>>>>>>> error. COz it expects an array vs a String.  How should I solve this
>>>>>>> issue?
>>>>>>>> Below is the AnalysisEngineDescription code.
>>>>>>>>
>>>>>>>>
>> //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>>>>>>>> primitiveDesc = new AnalysisEngineDescription_impl();
>>>>>>>>
>>>>>>>>  primitiveDesc.setPrimitive(true);
>>>>>>>>
>>>>>>>>  primitiveDesc.getMetaData().setName("Concept Mapper Offset
>>>>>> Tokenizer");
>>>>>>>>  primitiveDesc.setAnnotatorImplementationName(
>>>>>>>> "org.apache.uima.conceptMapper.ConceptMapper");
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>  ConfigurationParameter p1 = new ConfigurationParameter_impl();
>>>>>>>>
>>>>>>>>  p1.setName("AttributeList");
>>>>>>>>
>>>>>>>>  p1.setDescription("Attribute List");
>>>>>>>>
>>>>>>>>  p1.setType(ConfigurationParameter.TYPE_STRING); // Here is the
>>>> problem
>>>>>>>>  ConfigurationParameter p2 = new ConfigurationParameter_impl();
>>>>>>>>
>>>>>>>>  p2.setName("FeatureList");
>>>>>>>>
>>>>>>>>  p2.setDescription("Feature List");
>>>>>>>>
>>>>>>>>  p2.setType(ConfigurationParameter.TYPE_STRING);
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>> primitiveDesc.getMetaData().getConfigurationParameterDeclarations().setConfigurationParameters(
>>>>>>>> new ConfigurationParameter[] { p1,p2 });
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>> primitiveDesc.getMetaData().getConfigurationParameterSettings().setParameterSettings(
>>>>>>>> new NameValuePair[] { new NameValuePair_impl("AttributeList",
>>>>>>> "canonical"),
>>>>>>>> new NameValuePair_impl("FeatureList", "DictCanon") });
>>>>>>>>
>>>>>>>>        TypeSystemDescription typeSystem = new
>>>>>>> TypeSystemDescription_impl();
>>>>>>>>      dicTerm(typeSystem);
>>>>>>>>
>>>>>>>>      conceptMapperTokenizer(typeSystem);
>>>>>>>>
>>>>>>>>      baseTokenizer(typeSystem);
>>>>>>>>
>>>>>>>>
>>>>>>  primitiveDesc.getAnalysisEngineMetaData().setTypeSystem(typeSystem);
>> //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>>>>>>>> Also how should I pass the dictionary file in code?
>>>>>>>>
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>>
>>>>>>>> Harshal
>>>>>>>>
>>>>>>> --
>>>>>>> Renaud Richardet
>>>>>>> Blue Brain Project  PhD candidate
>>>>>>> EPFL  Station 15
>>>>>>> CH-1015 Lausanne
>>>>>>> phone: +41-78-675-9501
>>>>>>> http://people.epfl.ch/renaud.richardet
>>>>>>>
>>
>

Reply via email to