How to know write count of each item writer of composite item writer?
Here is my composite item writer
<bean id="Writer" class="org.springframework.batch.item.support.ClassifierCompositeItemWriter" scope="step">
<property name="classifier">
<bean class="org.springframework.batch.classify.BackToBackPatternClassifier">
<property name="routerDelegate"><bean class="com.classifier.RecordKeeperClassifier" scope="prototype" />
</property>
<property name="matcherMap">
<map>
<entry key="abc" value-ref="ItemWriter1" />
<entry key="xyz" value-ref="ItemWriter2" />
<entry key="*" value-ref="errorItemWriter" />
</map>
</property>
</bean>
</property>
</bean>
How to know no records with "abc" field as a key in the input file . I used footercallback listener and stepExecution.getWriteCount() method to know the writeCount , it is giving total count of inputs records I need only input records count with "abc" field
The total count of written items is cumulative so you have to count item manually using a ItemWriteListener if you are using a built-in writer or - optionally - overriding ItemWriter.write() for a custom writer
Related
I'm trying to create Jasper Report with 2 tables in Detail band and export it into 3 formats (PDF, DOCX and XLS), and there is an issue with 2nd table when exporting to XLS:
The table's row may take the height of 2 pages (last column field's content can be really large). So for DOCX and PDF formats it is totally okay that the export result has 2 pages containing similar row with the only difference in the last column value - first and second part of the column value after splitting. I am using pagination for this formats.
In XLS file such behavior is confusing - first column value is logically unique, but because of splitting it contains 2 lines in a row with the same 'unique' value. I set this property to avoid pagination for this format:
<property name="net.sf.jasperreports.export.xls.paginated" value="false"/>
The result looks like this:
duplicate for split row
I would like to join this to rows values. Maybe there is a way to merge such rows specially in XLS format. Please, help to find a workaround.
My report level properties are:
<property name="net.sf.jasperreports.export.xls.exclude.origin.keep.first.band.1" value="pageHeader"/>
<property name="net.sf.jasperreports.export.xls.exclude.origin.keep.first.band.2" value="columnHeader"/>
<property name="net.sf.jasperreports.export.xls.exclude.origin.band.2" value="pageFooter"/>
<property name="net.sf.jasperreports.export.xls.remove.empty.space.between.rows" value="true"/>
<property name="net.sf.jasperreports.export.xls.remove.empty.space.between.columns" value="true"/>
<property name="net.sf.jasperreports.export.xls.exclude.key.padding"/>
<property name="net.sf.jasperreports.export.xls.exclude.key.pages"/>
<property name="net.sf.jasperreports.export.xls.collapse.row.span" value="false"/>
<property name="net.sf.jasperreports.export.xls.collapse.column.span" value="false"/>
<property name="net.sf.jasperreports.export.xls.white.page.background" value="false"/>
<property name="net.sf.jasperreports.export.xls.detect.cell.type" value="true"/>
<property name="net.sf.jasperreports.export.xls.ignore.cell.border" value="false"/>
<property name="net.sf.jasperreports.export.xls.font.size.fix.enabled" value="true"/>
<property name="net.sf.jasperreports.print.keep.full.text" value="true"/>
<property name="net.sf.jasperreports.consume.space.on.overflow" value="true"/>
<property name="net.sf.jasperreports.export.xls.paginated" value="false"/>
<property name="net.sf.jasperreports.export.docx.frames.as.tables" value="false"/>
Properties for the last column text field:
<property name="net.sf.jasperreports.export.xls.auto.fit.row" value="true"/>
<property name="net.sf.jasperreports.export.xls.auto.fit.column" value="true"/>
<property name="net.sf.jasperreports.export.xls.wrap.text" value="true"/>
Thanks in advance!
Set Detail band property "Split Type" to "Prevent"
https://community.jaspersoft.com/wiki/set-detail-band-property-split-type-prevent
Information:
I have provided an indexing configuration file to cq5. I have not indexed on the property cq:template by specifying the following rule:
<index-rule nodeType="nt:base">
<property nodeScopeIndex="false">cq:template</property>
</index-rule>
I rebuilt the index.The logs show re-indexing is properly done.
The problem I am facing:
When I execute the following SQL2 query, it gives me the same results as it would give without the above indexing rule:
SELECT s.[cq:template] FROM [nt:base] AS s WHERE s.[cq:template] like '/apps/geometrixx/templates/contentpage'
Your rule actually omits all properties from the index except for cq:template rule (and excludes cq:template from the fulltext index because you defined nodeScopeIndex="false"). See the jackrabbit documentation for more details.
When you define the element <property nodeScopeIndex="false">cq:template</property>, the system includes the property in the index. However, nodeScopeIndex="false" tells CRX/Jackrabbit not to include the property in the fulltext index. Meaning it would be available for all searches except for those using contains(...) in sql or jcr:contains(...) for xpath.
To avoid indexing a property entirely, omit it from the first index-rule with nodeType/condition attributes that match its node. It must be the first matching rule because the rules in index_config.xml file are processed top down.
So to remove the cq:template property from the index in CQ5, do the following:
Extract the out of the box CQ5 version of indexing_config.xml (See this documentation for instructions)
Remove the <property nodeScopeIndex="false">cq:tempate</property> from <index-rule nodeType="nt:base">
Change the regular expression in the last rule <property isRegexp="true"> from .*:.* to ^(?!cq:template).*:.*$:
After you make the changes, the index-rule should look like this:
<index-rule nodeType="nt:base">
<property nodeScopeIndex="false">analyticsProvider</property>
<property nodeScopeIndex="false">analyticsSnippet</property>
<property nodeScopeIndex="false">hideInNav</property>
<property nodeScopeIndex="false">offTime</property>
<property nodeScopeIndex="false">onTime</property>
<property nodeScopeIndex="false">cq:allowedTemplates</property>
<property nodeScopeIndex="false">cq:childrenOrder</property>
<property nodeScopeIndex="false">cq:cugEnabled</property>
<property nodeScopeIndex="false">cq:cugPrincipals</property>
<property nodeScopeIndex="false">cq:cugRealm</property>
<property nodeScopeIndex="false">cq:designPath</property>
<property nodeScopeIndex="false">cq:isCancelledForChildren</property>
<property nodeScopeIndex="false">cq:isDeep</property>
<property nodeScopeIndex="false">cq:lastModified</property>
<property nodeScopeIndex="false">cq:lastModifiedBy</property>
<property nodeScopeIndex="false">cq:lastPublished</property>
<property nodeScopeIndex="false">cq:lastPublishedBy</property>
<property nodeScopeIndex="false">cq:lastReplicated</property>
<property nodeScopeIndex="false">cq:lastReplicatedBy</property>
<property nodeScopeIndex="false">cq:lastReplicationAction</property>
<property nodeScopeIndex="false">cq:lastReplicationStatus</property>
<property nodeScopeIndex="false">cq:lastRolledout</property>
<property nodeScopeIndex="false">cq:lastRolledoutBy</property>
<property nodeScopeIndex="false">cq:name</property>
<property nodeScopeIndex="false">cq:parentPath</property>
<property nodeScopeIndex="false">cq:segments</property>
<property nodeScopeIndex="false">cq:siblingOrder</property>
<property nodeScopeIndex="false">cq:template</property>
<property nodeScopeIndex="false">cq:trigger</property>
<property nodeScopeIndex="false">cq:versionComment</property>
<property nodeScopeIndex="false">jcr:createdBy</property>
<property nodeScopeIndex="false">jcr:lastModifiedBy</property>
<property nodeScopeIndex="false">sling:alias</property>
<property nodeScopeIndex="false">sling:resourceType</property>
<property nodeScopeIndex="false">sling:vanityPath</property>
<property isRegexp="true">^(?!cq:template).*:.*$</property>
</index-rule>
Note of warning:
I'm not sure if it is safe to remove cq:template from the search index as the product code may use it in some way. As a best practice, it is recommended to only exclude custom application properties. Also, you must include properties in the fulltext index which contain references to other content paths. This is because when you move a page in CQ5 (AEM) then it does a jcr:contains search to see where that page is referenced. So if you exclude such properties with nodeScopeIndex="false" or by modifying the regular expression above to omit them then the reference search will fail. Then you end up with stale references to old paths.
References:
Official indexing_config.xml reference: http://wiki.apache.org/jackrabbit/IndexingConfiguration
Instructions on how to update indexing_config.xml in CQ5: http://helpx.adobe.com/experience-manager/kb/SearchIndexingConfig.html
In an attempt to resolve this question, I'm taking a look at how our spring.net configuration works.
The root problem comes from this snippet:
<object name="someObject" singleton="false" type="SomeType.someObject, SomeAssembly">
<constructor-arg name="authSession">
<object type="Spring.Objects.Factory.Config.PropertyRetrievingFactoryObject, Spring.Core">
<property name="TargetObject" ref="AuthSessionManager" />
<property name="TargetProperty" value="CurrentAuthSession" />
</object>
</constructor-arg>
</object>
In a case where a user is not logged in, AuthSessionManager.CurrentAuthSession will be null. When that is the case, Spring.NET throws an exception: "Factory object returned null object".
How can I tell Spring that the null object is acceptable in this case?
You can use an expression to retrieve an object from the spring context in your constructor argument, something like:
<object name="someObject" singleton="false"
type="SomeType.someObject, SomeAssembly">
<constructor-arg name="authSession"
expression="#(AuthSessionManager).CurrentAuthSession" />
</object>
Expressions are allowed to evaluate to null, so you don't have to tell Spring anything.
This worked for me in a simple case (no nested contexts).
hi i have an error in the entity framework. i imported the sp get() into EF and return results as complex datatype 'GetResult'.In the edmx xml i have set the 'Amount' type to decimal.
<ComplexType Name="Get_Result">
<Property Type="String" Name="Description" Nullable="true" MaxLength="255" />
<Property Type="Decimal" Name="Amount" Nullable="false" />
<Property Type="Decimal" Name="Gst" Nullable="false" Precision="19" />
<Property Type="Decimal" Name="Total" Nullable="true" Precision="19" />
</ComplexType>
I try to bind the result with datagridview
gridview.DataSource = db.Get().ToList();
it kept giving me error message like this. and i couldn't find int32 anywhere in EF and have updated & built the EF multiple times.
The 'Amount' property on 'Get_Result' could not be set to a 'Int32' value. You must set this property to a non-null value of type 'Decimal'.
any help appreciated...
solved the issue by handling null exception
I've been using the Spring.Net IoC container and can use it to inject properties that are of type IList and even IList<T> but I'm a bit stumped as to how to inject a property thats of type string[].
There doesn't seem to be an <array> element defined in the XSD's and using <list> <value> </list> doesn't work either.
If anyone could post the xml I need to inject using an array for a property it'd be much appreciated
As mentioned here in the documentation you can inject a string array as a comma delimited string (not sure what the syntax is for escaping actual commas in strings if necessary). In other words your config would look something like this:
<object id="MyObject" type="Blah.SomeClass, Blah" >
<property name="StringArrayProperty" value="abc,def,ghi" />
</object>
Manually constructing a string[] with the following syntax also works, if you need something more complex (for example if you're looking the individual values up from some other reference rather than hard coding them):
<object id="TestStrArr" type="string[]" >
<constructor-arg value="3" />
<property name="[0]" value="qwe" />
<property name="[1]" value="asd" />
<property name="[2]" value="zxc" />
</object>
<object id="MyObject" type="Blah.SomeClass, Blah" >
<property name="StringArrayProperty" ref="TestStrArr" />
</object>