Archivo de la categoría: Sin categoría

[ERROR] Solr4: Unable to create core alfresco

Buenas.

Hace poco al instalar unos amps en un Alfresco 5.0.d usando el instalador apply_amps.sh de el directorio /opt/alfresco-5.0.d/bin/, al arrancar mi alfresco me encontré el siguiente error:

ERROR [solr.core.CoreContainer] [coreLoadExecutor-5-thread-2] Unable to create core: alfresco
org.apache.solr.common.SolrException: Could not load core configuration for core alfresco
at org.apache.solr.core.ConfigSetService.getConfig(ConfigSetService.java:66)
at org.apache.solr.core.CoreContainer.create(CoreContainer.java:554)
at org.apache.solr.core.CoreContainer$1.call(CoreContainer.java:261)
at org.apache.solr.core.CoreContainer$1.call(CoreContainer.java:253)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.solr.common.SolrException: org.xml.sax.SAXParseException; systemId: solrres:/schema.xml; lineNumber: 403; columnNumber: 105; An invalid XML character (Unicode: 0x2) was found in the comment.. Schema file is /Applications/Alfresco/community/alfresco-5.0.d/solr4/workspace-SpacesStore/schema.xml
at org.apache.solr.schema.IndexSchema.readSchema(IndexSchema.java:593)
at org.apache.solr.schema.IndexSchema.<init>(IndexSchema.java:165)
at org.apache.solr.schema.IndexSchemaFactory.create(IndexSchemaFactory.java:55)
at org.apache.solr.schema.IndexSchemaFactory.buildIndexSchema(IndexSchemaFactory.java:69)
at org.apache.solr.core.ConfigSetService.createIndexSchema(ConfigSetService.java:89)
at org.apache.solr.core.ConfigSetService.getConfig(ConfigSetService.java:62)
... 9 more
Caused by: org.apache.solr.common.SolrException: org.xml.sax.SAXParseException; systemId: solrres:/schema.xml; lineNumber: 403; columnNumber: 105; An invalid XML character (Unicode: 0x2) was found in the comment.
at org.apache.solr.core.Config.<init>(Config.java:148)
at org.apache.solr.core.Config.<init>(Config.java:86)
at org.apache.solr.schema.IndexSchema.readSchema(IndexSchema.java:443)
... 14 more
Caused by: org.xml.sax.SAXParseException; systemId: solrres:/schema.xml; lineNumber: 403; columnNumber: 105; An invalid XML character (Unicode: 0x2) was found in the comment.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
at org.apache.xerces.impl.XMLScanner.scanComment(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanComment(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at org.apache.solr.core.Config.<init>(Config.java:134)
... 16 more

Después de leer esta incidencia de Alfresco, intenté aplicarla pero no pude porque sencillamente no aplicaba a mi instalación (ya tenía el archivo nombrado a solr4.xml y no había por ningún lado el parámetro docBase).

Finalmente dí con la solución:

  1. Me dirijo a la carpeta de mi instalación
    • cd /opt/alfresco-5.0.d/
  2. Paro Alfresco
    • ./alfresco.sh stop
  3. Elimino el directorio solr4/
    • rm -rf  tomcat/webapps/solr4/
  4. Inicio Alfresco
    • ./alfresco.sh start
  5. Monitorizo el log para ver que todo funciona bien
    • tail -n500 -f tomcat/logs/catalina.out

Y listo, todo como la seda.

Sé que es una chorrada pero me ha llevado algo de tiempo dar con lo que era y si publicándolo os puedo ahorrar algo de tiempo, mejor que mejor ;-)

¡¡Un saludo!!

[Error] Problemas con SLF4JLogFactory y Alfresco 4.2.x

Muy buenas.

Cuando nos toca trabajar con la SDK 1.1.1 – porque algunas veces puede ocurrir que nos encontremos algún cliente sigue usando Alfresco 4.2.x – nos tocará lidiar con esta versión de SDK siguiendo la tabla de compatibilidades publicada por Alfresco. Si utilizamos el arqueotipo “todo en uno” por defecto tenemos un error nada más arrancar:

GRAVE: Servlet /alfresco threw load() exception
org.apache.commons.discovery.DiscoveryException: Class org.apache.commons.logging.impl.SLF4JLogFactory does not implement org.apache.commons.logging.LogFactory
at org.apache.commons.discovery.tools.ClassUtils.verifyAncestory(ClassUtils.java:180)
at org.apache.commons.discovery.tools.SPInterface.verifyAncestory(SPInterface.java:201)
at org.apache.commons.discovery.tools.SPInterface.newInstance(SPInterface.java:195)
at org.apache.commons.discovery.tools.DiscoverClass.newInstance(DiscoverClass.java:579)
at org.apache.commons.discovery.tools.DiscoverSingleton.find(DiscoverSingleton.java:418)
at org.apache.commons.discovery.tools.DiscoverSingleton.find(DiscoverSingleton.java:378)
at org.apache.axis.components.logger.LogFactory$1.run(LogFactory.java:45)
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.axis.components.logger.LogFactory.getLogFactory(LogFactory.java:41)
at org.apache.axis.components.logger.LogFactory.<clinit>(LogFactory.java:33)
at org.apache.axis.transport.http.AxisServletBase.<clinit>(AxisServletBase.java:58)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.springsource.loaded.ri.ReflectiveInterceptor.jlrConstructorNewInstance(ReflectiveInterceptor.java:1002)
at org.springsource.loaded.ri.ReflectiveInterceptor.jlClassNewInstance(ReflectiveInterceptor.java:989)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:138)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1144)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1088)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5033)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5317)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)

Incluso el error está reconocido por Alfresco en este ticket, pero lamentablemente la solución que proponen no funciona :-(

Después de horas de quebramiento de cabeza, cientos de pruebas y combinaciones, esto es lo que me funcionó:

Sigue leyendo

[Share] Ocultar la opción “crear sitio” en 4.1.x Enterprise

Buenas a todos.

Hace algún tiempo hice esta entrada basada en la 3.4.0 Enterprise y recientemente he tenido que adaptarla para la versión 4.1.x y me gustaría compartirla con vosotros. Esta entrada sirve para la version 4.1.x, no lo he probado en 4.2. ( de hecho sabiendo los cambios que existen con respecto a Aikau, apostaría que no funciona).

Los archivos que tenemos que tocar son 3:

  1. El dashlet de “Mis sitios”
  2. En la barra de arriba, dentro del menú desplegable
  3. El Dashlet de bienvenida

Como nos gusta seguir con las buenas prácticas, tendremos que copiar estos tres archivos (dentro de webapps/share/):

1.- {share-path-webapp}/WEB-INF/classes/alfresco/site-webscripts/org/alfresco/components/dashlets/my-sites.get.html.ftl
2.- {share-path-webapp}/WEB-INF/classes/alfresco/site-webscripts/org/alfresco/modules/header/sites.get.html.ftl
3.- {share-path-webapp}/WEB-INF/classes/alfresco/site-webscripts/org/alfresco/components/dashlets/dynamic-welcome.get.html.

Y pegarlos en tomcat/shared/classes/alfresco/web-extension/

1.- {share-path-shared}/web-extension/site-webscripts/org/alfresco/components/dashlets/my-sites.get.html.ftl
2.- {share-path-shared}/web-extension/site-webscripts/org/alfresco/modules/header/sites.get.html.ftl
3.- {share-path-shared}/web-extension/site-webscripts/org/alfresco/components/dashlets/dynamic-welcome.get.html.ftl

Si en web-extension no tenéis creada la estructura de carpeta, deberéis hacerlo ya que necesitamos replicar la misma estructura que se encuentra en el Share internamente. Una vez los tengamos en web-extension, vamos a proceder a modificarlos:

1.- Dashlet de “mis sitios” – my-sites.get.html.ftl

Vamos directamente a la linea 43 y en este framento de código:

                 <span class="align-right yui-button-align">
                    <span class="first-child">
                       <a href="#" id="${id}-createSite-button" class="theme-color-1">
                          <img src="${url.context}/res/components/images/site-16.png" style="vertical-align: text-bottom" />
                          ${msg("link.createSite")}</a>
                    </span>
                 </span>

Lo encapsularemos con un if que chequeará la seguridad. Nos debe quedar así:

 

         <#if user.isAdmin>
                 <span class="align-right yui-button-align">
                    <span class="first-child">
                       <a href="#" id="${id}-createSite-button" class="theme-color-1">
                          <img src="${url.context}/res/components/images/site-16.png" style="vertical-align: text-bottom" />
                          ${msg("link.createSite")}</a>
                    </span>
                 </span>
         </#if>

Con esto, cuando Share vaya a cargar el componente visual, chequeará si el usuario que tiene hecho login tiene permisos de administrador.

2.- Link menú desplegable – sites.get.html.ftl

Debemos ir a la línea 25, ahí encontraremos este fragmento donde se pinta el link:

              <ul class="create-site-menuitem">
                 <li>
                    <a href="#" onclick="Alfresco.util.ComponentManager.get('${id_js}').showCreateSite(); return false;">${msg("label.create-site")}</a>
                 </li>
              </ul>

Hacemos lo mismo en el caso anterior y lo encapsularemos en una comprobación para que chequee los permisos del usuario que quiera visualizarlo:

      <#if user.isAdmin>
              <ul class="create-site-menuitem">
                 <li>
                    <a href="#" onclick="Alfresco.util.ComponentManager.get('${id_js}').showCreateSite(); return false;">${msg("label.create-site")}</a>
                 </li>
              </ul>
          </#if>

3.- Dashlet de bienvenida – dynamic-welcome.get.html.ftl

Este caso es algo especial porque si queremos que no pinte el link dentro del dashlet, deberemos tocar el javascript para manipular el número de columnas y que se “salte” la del sitio y, además, el freemarket (ftl) para retocar los estilos y que no se descuadre. En mi caso, sencillamente mostraré este dashlet solo a los usuarios administradores, y lo ocultaré para aquellos que no lo sean.
En este caso es sencillo: Tendremos que poner la condición arriba del todo y encapsular el dashlet completo:

Original:

 <#if showDashlet>
   <#assign el=args.htmlid?html>
   <script type="text/javascript">//<![CDATA[
   new Alfresco.dashlet.DynamicWelcome("${el}", "${dashboardUrl}", "${dashboardType}", "${siteNodeRef!""}").setMessages(${messages});
   //]]></script>
   <div class="dashlet dynamic-welcome">
      <a id="${el}-close-button" class="welcome-close-button" href="#">
         <img src="${url.context}/res/components/images/delete-16.png" />
         <span>${msg("welcome.close")}</span>
      </a>
    ...
    ...
              <div class="welcome-height-adjuster">&nbsp;</div>
         </div>
      </div>
    </div>
 </#if>

Modificado:

<#if user.isAdmin>
 <#if showDashlet>
   <#assign el=args.htmlid?html>
   <script type="text/javascript">//<![CDATA[
   new Alfresco.dashlet.DynamicWelcome("${el}", "${dashboardUrl}", "${dashboardType}", "${siteNodeRef!""}").setMessages(${messages});
   //]]></script>
   <div class="dashlet dynamic-welcome">
      <a id="${el}-close-button" class="welcome-close-button" href="#">
         <img src="${url.context}/res/components/images/delete-16.png" />
         <span>${msg("welcome.close")}</span>
      </a>
      ...
      ...
           <div class="welcome-height-adjuster">&nbsp;</div>
         </div>
      </div>
    </div>
 </#if>
</#if>

Y listo, con estas modificaciones Share cuando pinte el link, chequeará primero si el usuario que intenta visualizarlo tiene permisos de administrador o no.

Espero que sirva de ayuda,

¡Un saludo!

Meetup de Alfresco en Madrid 2011: Detrás de las cámaras

Muy buenas a todos =)

Este martes pasado tuvimos la gran suerte de haber celebrado el primer Meetup de Alfresco de la comunidad Española en Madrid. Realmente llevamos muuuucho tiempo intentando organizar una de éstas, pero gracias a Alfresco el cual nos ha “impulsado” a realizarlo (y a 100$ para “cafés y refrescos”), por fín lo hemos conseguido celebrar, además coincidiendo con numerosas ciudades de todo el mundo y solo tengo una palabra para resumirlo: Increíble. Durante este post os voy a intentar explicar el por qué.

Los encargados por parte de la comunidad hemos sido Pedro Jiménez Caracuel (pjcaracuel), Javier Martinez (Innovasoft) y Cristina Martín (una servidora, CristinaMR) y desde Alfresco Toni de la Fuente coordinado con Jeff Potts. Aunque originariamente estuviera pensada hacerse en Granada, sopesamos realizarlo en la capital de España debido a que había varios asistentes que se desplazaban desde distintos puntos de la geografía y era más sencillo llegar al centro que a un extremo – a pesar de lo realmente bonita que es Granada… Ya caerá alguna por allí ;-) –

Todos los que nos conocíamos de antes, creo que siempre tuvimos ganas de hacer algo así porque después de ayudar a tantas personas del foro, o de que me ayuden sin pedir nada a cambio, es bonito pensar en la idea de que todos tengamos al menos la oportunidad de conocernos y poner cara a las personas que hay detrás de los nicks de los foros.
Pero al hablar sobre cómo organizarlo, el tema que se nos planteaba era si hacerlo “formal” o darle un punto diferente (que no se diga que los Españoles no marcamos la diferencia ;)) Así que tuvimos varios mails debatiendo como podíamos hacerlo, porque desde Alfresco esta semana se presentó el Alfresco 4.0 Community y ese podía ser un buen tema para tratar, pero todos coincidimos con el hecho de hacer el evento desde un punto de vista informal, quiere decir, nada de ir con la mentalidad de vender o de destacar como empresa, sino más bien un encuentro de técnicos, personas “come marrones” que nos hemos pegado con Alfresco y que queremos echar el rato “a gusto”.

Pedro y yo estuvimos un tiempo trabajando en Madrid (un saludo para todos los conocidos de allí ;)) y él mismo me dio a conocer el lugar en el que finalmente celebraríamos el evento: Oneill’s de la calle Principe en Madrid. Y bueno, tras hablarlo con los demás finalmente decidimos probar a hacerlo allí. Me puse en contacto con el dueño del pub y la verdad es que fue muy atento y amable en todo momento y realmente se portó muy bien en todo momento. Pues bien, una vez atado todos los cabos solo quedaba divulgar y esperar.

El mismo día del evento los primeros en llegar fuimos Patricia (Cybermakoki), Diego (su pareja), Mª Carmen (Goja), Pedro y yo. Así que haciendo un poco de tiempo fueron llegando los asistentes y empezamos el meetup:

El evento estuvo marcado por la charla de Toni sobre lo nuevo de Alfresco 4.0 con respecto a las redes sociales, después hubo una segunda charla mía y de Patricia sobre una capa de Cmis que hemos desarrollado en conjunto (para liberlarla) y en tercer lugar le pasamos el testigo a Cesar Capillas de Zylk para tratar sobre su experiencia con Cmis y mostrar un producto llamado sinadura que han desarrollado en su empresa y que tiene integración con firma digital.

Algunas fotos del evento:

Sigue leyendo