Manejar si una propiedad es multivaluada o no

cancel
Showing results for 
Search instead for 
Did you mean: 
merimm
Member II

Manejar si una propiedad es multivaluada o no

Hola,

Por favor, ¿alguién me podría explicar como ver si una propiedad es multivaluada dado un modelo?

Es decir, yo tengo un modelo definido con un tipo de contenido que tiene varias propiedades, entre ellas una que es multi-valuada:

<property name="my:grupo">
<title>Grupo</title>
<type>d:text</type>
<mandatory>true</mandatory>
<multiple>true</multiple>
</property>

Entonces, dada una propiedad de mi modelo consigo ver el tipo, el nombre, el título, etc. pero no si es multivaluada o no  Smiley Sad :

String propiedad = "my:grupo";
DictionaryServiceSoapBindingStub dssbs= WebServiceFactory.getDictionaryService();
org.alfresco.webservice.types.PropertyDefinition[] propDefs = dssbs.getProperties(new String[] {propiedad});
System.out.println("          Descripción: "+propDefs[0].getDescription());
System.out.println("          DefaultValue: "+propDefs[0].getDefaultValue());
System.out.println("          Name: "+propDefs[0].getName());
System.out.println("          Title: "+propDefs[0].getTitle());

Agradezco mucho vuestra ayuda.

Un saludo,

merimm
6 Replies
ajv
Member II

Re: Manejar si una propiedad es multivaluada o no

Hola merimm,

La verdad que revisando el DictionaryService no he encontrado nada para esto…
Así que me he puesto a mirar dónde se muestra esa información a nivel de cliente web…y me he dado cuenta que el node browser muestra un –Collection– si el valor de la propiedad es múltiple.
Entonces, no me ha tocado otra que acceder al código fuente a ver…  Smiley Very Happy  Y resulta que en org.alfresco.web.bean.AdminNodeBrowseBean hay una forma de hacerlo.
Adjunto el fragmento de código (se encuentra sobre la línea 580):
    /**
     * Property wrapper class
     */
    public class Property
    {
        private QName name;
        private boolean isCollection = false;
        private DataModel values;
        private String datatype;
        private String residual;
   
        /**
         * Construct
         *
         * @param name  property name
         * @param value  property values
         */
        public Property(QName name, Serializable value)
        {
            this.name = name;
           
            PropertyDefinition propDef = dictionaryService.getProperty(name);
            if (propDef != null)
            {
                datatype = propDef.getDataType().getName().toString();
                residual = "false";
            }
            else
            {
                residual = "true";
            }
           
            // handle multi/single values
            // TODO: perhaps this is not the most efficient way - lots of list creations
            List<Value> values = new ArrayList<Value>();
            if (value instanceof Collection)
            {
                isCollection = true;
                for (Serializable multiValue : (Collection<Serializable>)value)
                {
                    values.add(new Value(multiValue));
                }
            }
            else
            {
                values.add(new Value(value));
            }
            this.values = new ListDataModel(values);
        }
Si te fijas lo que hace es mirar si el valor de la propiedad es instancia de un Collection. Si es así, se considera la propiedad Multiple…El propio autor del código reconoce que no es la vía mas eficiente…pero bueno, es lo que hay. Además, da la sensación que simplemente a través de la definición del modelo no hay ningún mecanismo para obtenerlo.

En fin, espero que te sirva de ayuda.
Hasta pronto!
pjcaracuel_2349
Active Member II

Re: Manejar si una propiedad es multivaluada o no

Buenas,

Investigando un poquito mas, en la clase
org.alfresco.repo.domain.PropertyValue

tienes un metodo que devuelve un boolean "isMultiValued() "

que quizas te de lo que necesitas

Saludos
merimm
Member II

Re: Manejar si una propiedad es multivaluada o no

Gracias a los dos por vuestras respuestas.

Mi idea en principio era poder obtenerlo de la definición del modelo, ya que tengo que hacer el tratamiento (ver si es multivaluada) antes de insertar los metadatos en el nodo y no a posteriori. Pero vamos, que si no se puede buscaré alguna alternativa  Smiley Happy . Gracias de nuevo.

Un saludo,

merimm
dacedos
Member II

Re: Manejar si una propiedad es multivaluada o no

Hola!

Siento reabrir este hilo tan antiguo pero tiene algo que ver con lo que necesito.

Tengo problemas para guardar una propiedad multiple desde codigo java. ¿Alguien sabe como hacerlo?

Tengo una propiedad declarada asi

<property name="controlado:fechaFirmas">
  <title>Fecha de la ultima firma</title>
  <type>d:date</type>
  <multiple>true</multiple>
</property>

De momento tengo que la recupere como tipo Serializable y al imprimirla saca algo como:

[Thu May 21 14:12:00 CEST 2009, Fri May 22 14:12:00 CEST 2009]

El problema es que no se como podria hacerlo para poder escribirla desde java. Lo que hice es seguir este tutorial que encontre en internet que explica bastante bien como mapear nodos de alfresco en objetos java

http://www.scribd.com/doc/13856390/Java-Annotations-for-Your-Alfresco-Content-Model
pjcaracuel_2349
Active Member II

Re: Manejar si una propiedad es multivaluada o no

oki,

Echale un vistazo a este post
http://forums.alfresco.com/es/viewtopic.php?f=11&t=500

Por otro lado asegurate bien de formatear la fecha correctamente a la hora de guardarla en Alfresco.

Saludos
dacedos
Member II

Re: Manejar si una propiedad es multivaluada o no

muchas gracias Pedro, eso era lo que necesitaba pero busque por multiple y no vi el hilo