You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@syncope.apache.org by te...@net-c.com on 2020/10/21 17:37:36 UTC

custom reportlet and reportletConf do not appear on console

Hi,


I developed my own reportlet class and reportletConf that I put in:



core/src/main/java/org/apache/syncope/core/provisioning/java/job/report/myReportlet.java

core/src/main/java/org/apache/syncope/common/lib/report/myReportletConf.java



Maven build runs well and I see my classes like:

./core/target/syncope/WEB-INF/classes/org/apache/syncope/core/provisioning/java/job/report/myReportlet.class

./core/target/syncope/WEB-INF/classes/org/apache/syncope/common/lib/report/myReportletConf.class



However, no way to see them on console when I go to Configuration -> implementation -> reportlets -> [add]



Did I miss something ??



Thanks


Re: custom reportlet and reportletConf do not appear on console

Posted by te...@net-c.com.
Indeed, surely something is wrong because it fails to get the domainHolder :(


09:31:51.508 ERROR org.apache.syncope.core.provisioning.java.job.report.ReportJob - While executing report bdd0ab2b-411f-4755-90ab-2b411f0755c2

org.quartz.JobExecutionException: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.apache.syncope.core.provisioning.java.job.report.myReportlet': Unsatisfied dependency expressed through field 'domainHolder'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.apache.syncope.core.persistence.api.DomainHolder' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

at org.apache.syncope.core.provisioning.java.job.report.DefaultReportJobDelegate.execute(DefaultReportJobDelegate.java:208) ~[syncope-core-provisioning-java-2.1.7.jar:2.1.7]

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_265]

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_265]

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_265]

at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_265]

at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) ~[spring-aop-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) ~[spring-aop-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:295) ~[spring-tx-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98) ~[spring-tx-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.apache.syncope.core.persistence.jpa.spring.DomainTransactionInterceptor.invoke(DomainTransactionInterceptor.java:60) ~[syncope-core-persistence-jpa-2.1.7.jar:2.1.7]

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at com.sun.proxy.$Proxy193.execute(Unknown Source) ~[?:?]

at org.apache.syncope.core.provisioning.java.job.report.ReportJob.lambda$execute$0(ReportJob.java:67) ~[syncope-core-provisioning-java-2.1.7.jar:2.1.7]

at org.apache.syncope.core.spring.security.AuthContextUtils.execWithAuthContext(AuthContextUtils.java:117) ~[syncope-core-spring-2.1.7.jar:2.1.7]

at org.apache.syncope.core.provisioning.java.job.report.ReportJob.execute(ReportJob.java:64) ~[syncope-core-provisioning-java-2.1.7.jar:2.1.7]

at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[quartz-2.3.2.jar:?]

at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) ~[quartz-2.3.2.jar:?]

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.apache.syncope.core.provisioning.java.job.report.myReportlet': Unsatisfied dependency expressed through field 'domainHolder'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.apache.syncope.core.persistence.api.DomainHolder' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:598) ~[spring-beans-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90) ~[spring-beans-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:376) ~[spring-beans-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1402) ~[spring-beans-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:591) ~[spring-beans-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:514) ~[spring-beans-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:351) ~[spring-beans-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.apache.syncope.core.spring.ImplementationManager.buildJavaWithConf(ImplementationManager.java:228) ~[syncope-core-spring-2.1.7.jar:2.1.7]

at org.apache.syncope.core.spring.ImplementationManager.buildReportlet(ImplementationManager.java:64) ~[syncope-core-spring-2.1.7.jar:2.1.7]

at org.apache.syncope.core.provisioning.java.job.report.DefaultReportJobDelegate.execute(DefaultReportJobDelegate.java:171) ~[syncope-core-provisioning-java-2.1.7.jar:2.1.7]

... 18 more

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.apache.syncope.core.persistence.api.DomainHolder' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1680) ~[spring-beans-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1239) ~[spring-beans-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1193) ~[spring-beans-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:595) ~[spring-beans-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90) ~[spring-beans-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:376) ~[spring-beans-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1402) ~[spring-beans-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:591) ~[spring-beans-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:514) ~[spring-beans-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:351) ~[spring-beans-5.1.17.RELEASE.jar:5.1.17.RELEASE]

at org.apache.syncope.core.spring.ImplementationManager.buildJavaWithConf(ImplementationManager.java:228) ~[syncope-core-spring-2.1.7.jar:2.1.7]

at org.apache.syncope.core.spring.ImplementationManager.buildReportlet(ImplementationManager.java:64) ~[syncope-core-spring-2.1.7.jar:2.1.7]

at org.apache.syncope.core.provisioning.java.job.report.DefaultReportJobDelegate.execute(DefaultReportJobDelegate.java:171) ~[syncope-core-provisioning-java-2.1.7.jar:2.1.7]

... 18 more



#######################################

package org.apache.syncope.core.provisioning.java.job.report;



import java.util.List;

import java.util.Map;

import java.util.HashMap;

import java.util.Iterator;

import java.util.concurrent.atomic.AtomicReference;

import javax.sql.DataSource;

import org.apache.commons.lang3.StringUtils;

import org.apache.syncope.common.lib.log.AuditEntry;

import org.apache.syncope.common.lib.report.myReportletConf;

import org.apache.syncope.common.lib.report.ReportletConf;

import org.apache.syncope.core.persistence.api.DomainHolder;

import org.apache.syncope.core.persistence.api.dao.LoggerDAO;

import org.apache.syncope.core.spring.security.AuthContextUtils;

import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;

import org.apache.syncope.core.persistence.api.dao.ReportletConfClass;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.jdbc.core.JdbcTemplate;

import org.xml.sax.ContentHandler;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.AttributesImpl;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;



@ReportletConfClass(myReportletConf.class)

public class myReportlet extends AbstractReportlet {



    private static final Logger LOG = LoggerFactory.getLogger(myReportlet.class);



    @Autowired

    private DomainHolder domainHolder;



    private myReportletConf conf;



    private DataSource datasource;



    private void doExtractConf(final ContentHandler handler, final AtomicReference<String> status) throws SAXException {

        status.set("Fetching " + conf.getSize() + " rows from the " + LoggerDAO.AUDIT_TABLE + " table");

        LOG.info("1");

        JdbcTemplate jdbcTemplate = new JdbcTemplate(datasource);

        jdbcTemplate.setMaxRows(conf.getSize());

LOG.info("2");

        List<Map<String, Object>> rows = jdbcTemplate.

                queryForList("SELECT * FROM " + LoggerDAO.AUDIT_TABLE + " ORDER BY EVENT_DATE DESC");



        // "logger":{"type":"LOGIC","category":"RoleLogic","subcategory":null,"event":"update","result":"SUCCESS"}

        HashMap<String, Integer> stats = new HashMap<>();

        LOG.info("3");

for (Map<String, Object> row : rows) {

            AuditEntry auditEntry = POJOHelper.deserialize(row.get("MESSAGE").toString(), AuditEntry.class);

    LOG.info("31");



    if (StringUtils.isNotBlank(auditEntry.getLogger().getCategory()) &&

        auditEntry.getLogger().getResult() != null &&

        StringUtils.isNotBlank(auditEntry.getLogger().getEvent())) {

                LOG.info("32");

String category = auditEntry.getLogger().getCategory();

String event = auditEntry.getLogger().getEvent();

String result = auditEntry.getLogger().getResult().name();

String key = category+"."+event+"."+result;

                LOG.info("33");

int count = 0;

if (stats.containsKey(key)) {

                  count = stats.get(key); 

}

                LOG.info("34");

stats.put(key, count+1);



            }

}



LOG.info("4");

        handler.startElement("", "", "statistiques", null);

        AttributesImpl atts = new AttributesImpl();

LOG.info("5");



Iterator<Map.Entry<String, Integer>> entrySet = stats.entrySet().iterator();

        while (entrySet.hasNext()) {

            LOG.info("51");

            Map.Entry<String, Integer> entry = entrySet.next();



            atts.clear();

            handler.startElement("", "", "audit", atts);

    String key = entry.getKey();

    Integer value = entry.getValue();

            LOG.info("52");

            String[] s = key.split("\\.");

            atts.clear();

    atts.addAttribute("", "", "categorie", ReportXMLConst.XSD_STRING, s[0]);

    atts.addAttribute("", "", "action", ReportXMLConst.XSD_STRING, s[1]);

    atts.addAttribute("", "", "resultat", ReportXMLConst.XSD_STRING, s[2]);

    atts.addAttribute("", "", "nombre", ReportXMLConst.XSD_INT, String.valueOf(value));

            handler.endElement("", "", "audit");

    LOG.info("53");

        }

        handler.endElement("", "", "statistiques");

        LOG.info("6");

        status.set("Fetched " + conf.getSize() + " rows from the SYNCOPEAUDIT table");

    }



    @Override

    protected void doExtract(

            final ReportletConf conf,

            final ContentHandler handler,

            final AtomicReference<String> status)

            throws SAXException {

LOG.info("7");



        if (conf instanceof myReportletConf) {

            this.conf = myReportletConf.class.cast(conf);

        } else {

            throw new ReportException(new IllegalArgumentException("Invalid configuration provided"));

        }

        LOG.info("8");

LOG.info(AuthContextUtils.getDomain());

LOG.info("81");

        LOG.info(String.valueOf(domainHolder.getDomains().size()));

LOG.info("82");

        datasource = domainHolder.getDomains().get(AuthContextUtils.getDomain());

        if (datasource == null) {

            throw new ReportException(new IllegalArgumentException("Could not get to DataSource"));

        }

        LOG.info("9");

        doExtractConf(handler, status);

    }

}



De : Francesco Chicchiriccò <il...@apache.org>
À : user@syncope.apache.org
Sujet : Re: custom reportlet and reportletConf do not appear on console
Date : 22/10/2020 10:14:45 Europe/Paris

Hi,

the steps you mention below are normally not needed: there must be something in your Maven project or settings that are impeding the normal behavior.



Regards.



On 22/10/20 10:06, tempo@net-c.com wrote:

Hi, 


Finally found how to do it.



For those having same troubles:



You need to place your Conf in:

core/src/main/java/org/apache/syncope/common/lib/report/myReportletConf.java

AND IN

console/src/main/java/org/apache/syncope/common/lib/report/myReportletConf.java



Then your reportlet in

core/src/main/java/org/apache/syncope/core/provisioning/java/job/report/myReportlet.java



Then finally you also need to have (it does not build if it is not here)

core/src/main/java/org/apache/syncope/core/persistence/api/DomainHolder.java

Whom the content can be taken on github

Enjoy.

De : tempo@net-c.com
À : user@syncope.apache.org
Sujet : custom reportlet and reportletConf do not appear on console
Date : 21/10/2020 19:37:36 Europe/Paris

Hi, 


I developed my own reportlet class and reportletConf that I put in:



core/src/main/java/org/apache/syncope/core/provisioning/java/job/report/myReportlet.java

core/src/main/java/org/apache/syncope/common/lib/report/myReportletConf.java



Maven build runs well and I see my classes like:

./core/target/syncope/WEB-INF/classes/org/apache/syncope/core/provisioning/java/job/report/myReportlet.class

./core/target/syncope/WEB-INF/classes/org/apache/syncope/common/lib/report/myReportletConf.class



However, no way to see them on console when I go to Configuration -> implementation -> reportlets -> [add]



Did I miss something ??



Thanks



-- 
Francesco Chicchiriccò

Tirasa - Open Source Excellence
http://www.tirasa.net/

Member at The Apache Software Foundation
Syncope, Cocoon, Olingo, CXF, OpenJPA, PonyMail
http://home.apache.org/~ilgrosso/



Re: custom reportlet and reportletConf do not appear on console

Posted by Francesco Chicchiriccò <il...@apache.org>.
Hi,
the steps you mention below are normally not needed: there must be something in your Maven project or settings that are impeding the normal behavior.

Regards.

On 22/10/20 10:06, tempo@net-c.com wrote:
> Hi,
>
> Finally found how to do it.
>
> For those having same troubles:
>
> You need to place your Conf in:
> core/src/main/java/org/apache/syncope/common/lib/report/myReportletConf.java
> AND IN
> console/src/main/java/org/apache/syncope/common/lib/report/myReportletConf.java
>
> Then your reportlet in
> core/src/main/java/org/apache/syncope/core/provisioning/java/job/report/myReportlet.java
>
> Then finally you also need to have (it does not build if it is not here)
> core/src/main/java/org/apache/syncope/core/persistence/api/DomainHolder.java
> Whom the content can be taken on github
>
> Enjoy.
>
>> De : tempo@net-c.com
>> À : user@syncope.apache.org
>> Sujet : custom reportlet and reportletConf do not appear on console
>> Date : 21/10/2020 19:37:36 Europe/Paris
>>
>> Hi,
>>
>> I developed my own reportlet class and reportletConf that I put in:
>>
>> core/src/main/java/org/apache/syncope/core/provisioning/java/job/report/myReportlet.java
>> core/src/main/java/org/apache/syncope/common/lib/report/myReportletConf.java
>>
>> Maven build runs well and I see my classes like:
>> ./core/target/syncope/WEB-INF/classes/org/apache/syncope/core/provisioning/java/job/report/myReportlet.class
>> ./core/target/syncope/WEB-INF/classes/org/apache/syncope/common/lib/report/myReportletConf.class
>>
>> However, no way to see them on console when I go to Configuration -> implementation -> reportlets -> [add]
>>
>> Did I miss something ??
>>
>> Thanks


-- 
Francesco Chicchiriccò

Tirasa - Open Source Excellence
http://www.tirasa.net/

Member at The Apache Software Foundation
Syncope, Cocoon, Olingo, CXF, OpenJPA, PonyMail
http://home.apache.org/~ilgrosso/


Re: custom reportlet and reportletConf do not appear on console

Posted by te...@net-c.com.
Hi,


Finally found how to do it.



For those having same troubles:



You need to place your Conf in:

core/src/main/java/org/apache/syncope/common/lib/report/myReportletConf.java

AND IN

console/src/main/java/org/apache/syncope/common/lib/report/myReportletConf.java



Then your reportlet in

core/src/main/java/org/apache/syncope/core/provisioning/java/job/report/myReportlet.java



Then finally you also need to have (it does not build if it is not here)

core/src/main/java/org/apache/syncope/core/persistence/api/DomainHolder.java

Whom the content can be taken on github

Enjoy.

De : tempo@net-c.com
À : user@syncope.apache.org
Sujet : custom reportlet and reportletConf do not appear on console
Date : 21/10/2020 19:37:36 Europe/Paris

Hi,


I developed my own reportlet class and reportletConf that I put in:



core/src/main/java/org/apache/syncope/core/provisioning/java/job/report/myReportlet.java

core/src/main/java/org/apache/syncope/common/lib/report/myReportletConf.java



Maven build runs well and I see my classes like:

./core/target/syncope/WEB-INF/classes/org/apache/syncope/core/provisioning/java/job/report/myReportlet.class

./core/target/syncope/WEB-INF/classes/org/apache/syncope/common/lib/report/myReportletConf.class



However, no way to see them on console when I go to Configuration -> implementation -> reportlets -> [add]



Did I miss something ??



Thanks