Map of collection
Hi,
has someone an example for a persistent map with a string as key and a
collection of strings as values?
Is it necessary to build a persistent class to hold the collection? Can
this be optimized?
Cheers,
Andreas
Kodo has no standard mapping for this. In Kodo 3, you could handle it
efficiently by writing a small Kodo externalizer, but in 2.5 you don't
have many options other than a BLOB mapping or modelling it as a
persistent class.
Similar Messages
-
Issue with xsd Data type mapping for collection of user defined data type
Hi,
I am facing a issue with wsdl for xsd mapping for collection of user defined data type.
Here is the code snippet.
sample.java
@WebMethod
public QueryPageOutput AccountQue(QueryPageInput qpInput)
public class QueryPageInput implements Serializable, Cloneable
protected Account_IO fMessage = null;
public class QueryPageOutput implements Serializable, Cloneable
protected Account_IO fMessage = null;
public class Account_IO implements Serializable, Cloneable {
protected ArrayList <AccountIC> fintObjInst = null;
public ArrayList<AccountIC>getfintObjInst()
return (ArrayList<AccountIC>)fintObjInst.clone();
public void setfintObjInst(AccountIC val)
fintObjInst = new ArrayList<AccountIC>();
fintObjInst.add(val);
Public class AccountIC
protected String Name;
protected String Desc;
public String getName()
return Name;
public void setName(String name)
Name = name;
For the sample.java code, the wsdl generated is as below:
<?xml version="1.0" encoding="UTF-8" ?>
<wsdl:definitions
name="SimpleService"
targetNamespace="http://example.org"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://example.org"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
>
<wsdl:types>
<xs:schema version="1.0" targetNamespace="http://examples.org" xmlns:ns1="http://example.org/types"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="http://example.org/types"/>
<xs:element name="AccountWSService" type="ns1:accountEMRIO"/>
</xs:schema>
<xs:schema version="1.0" targetNamespace="http://example.org/types" xmlns:ns1="http://examples.org"
xmlns:tns="http://example.org/types" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="http://examples.org"/>
<xs:complexType name="queryPageOutput">
<xs:sequence>
<xs:element name="fSiebelMessage" type="tns:accountEMRIO" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="accountEMRIO">
<xs:sequence>
<xs:element name="fIntObjectFormat" type="xs:string" minOccurs="0"/>
<xs:element name="fMessageType" type="xs:string" minOccurs="0"/>
<xs:element name="fMessageId" type="xs:string" minOccurs="0"/>
<xs:element name="fIntObjectName" type="xs:string" minOccurs="0"/>
<xs:element name="fOutputIntObjectName" type="xs:string" minOccurs="0"/>
<xs:element name="fintObjInst" type="xs:anyType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="queryPageInput">
<xs:sequence>
<xs:element name="fPageSize" type="xs:string" minOccurs="0"/>
<xs:element name="fSiebelMessage" type="tns:accountEMRIO" minOccurs="0"/>
<xs:element name="fStartRowNum" type="xs:string" minOccurs="0"/>
<xs:element name="fViewMode" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://example.org"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://example.org" xmlns:ns1="http://example.org/types">
<import namespace="http://example.org/types"/>
<xsd:complexType name="AccountQue">
<xsd:sequence>
<xsd:element name="arg0" type="ns1:queryPageInput"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="AccountQue" type="tns:AccountQue"/>
<xsd:complexType name="AccountQueResponse">
<xsd:sequence>
<xsd:element name="return" type="ns1:queryPageOutput"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="AccountQueResponse" type="tns:AccountQueResponse"/>
</schema>
</wsdl:types>
<wsdl:message name="AccountQueInput">
<wsdl:part name="parameters" element="tns:AccountQue"/>
</wsdl:message>
<wsdl:message name="AccountQueOutput">
<wsdl:part name="parameters" element="tns:AccountQueResponse"/>
</wsdl:message>
<wsdl:portType name="SimpleService">
<wsdl:operation name="AccountQue">
<wsdl:input message="tns:AccountQueInput" xmlns:ns1="http://www.w3.org/2006/05/addressing/wsdl"
ns1:Action=""/>
<wsdl:output message="tns:AccountQueOutput" xmlns:ns1="http://www.w3.org/2006/05/addressing/wsdl"
ns1:Action=""/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="SimpleServiceSoapHttp" type="tns:SimpleService">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="AccountQue">
<soap:operation soapAction=""/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="SimpleService">
<wsdl:port name="SimpleServicePort" binding="tns:SimpleServiceSoapHttp">
<soap:address location="http://localhost:7101/WS-Project1-context-root/SimpleServicePort"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
In the above wsdl the collection of fintObjInst if of type xs:anytype. From the wsdl, I do not see the xsd mapping for AccountIC which includes Name and Desc. Due to which, when invoking the web service from a different client like c#(by creating proxy business service), I am unable to set the parameters for AccountIC. I am using JAX-WS stack and WLS 10.3. I have already looked at blog http://weblogs.java.net/blog/kohlert/archive/2006/10/jaxws_and_type.html but unable to solve this issue. However, at run time using a tool like SoapUI, when this wsdl is imported, I am able to see all the params related to AccountIC class.
Can some one help me with this.
Thanks,
Sudha.Did you try adding the the XmlSeeAlso annotation to the webservice
@XmlSeeAlso({<package.name>.AccountIC.class})
This will add the schema for the data type (AccountIC) to the WSDL.
Hope this helps.
-Ajay -
ImmutableArrayList default for Map Long, Collection String
Hi,
There are a few topics out there about the com.tangosol.util.ImmutableArrayList default, but the actual fix still seems a bit unclear to me.
In my example there is a Map with each entry containing a Collection of Strings (i.e. Map<Long, Collection<String>>). Objects will be placed in the Map as ArrayLists, but they seem to come out as ImmutableArrayLists.
The Oracle site mentions wrapping the Collection (http://extranet.tangosol.com/display/COH35UG/Best+Practices+for+Coherence+Extend).
There is another Oracle forum post that suggests using more general classes (List instead of ArrayList). (Serialize an ArrayList<ArrayList>
It seems like you have to make a new collection anytime you wish to reserialize the object. Is there a better way?
Thanks for taking the time,
MikeThis problem comes up for us when persisting documents. We are torn between saving as XML vice saving a normalized object model or something else: like your database solution.
Since you have already designed the database, then you can reverse out the TopLink class from that database design in the mapping workbench. You then have to perform a transform in the middle tier to extract your business model.
Alternatively, if you want your business model to map via ORM to the data model, then you would have a database design that more closely maps the business model design then you get three tables:
TopLevel
Integer primaryKey; //This table may just have the PK
SetMap theSets;
SetMap
TopLevel parent; //FK to the Parent table
Long primaryKey; //Assumes the Longs are globally unique. If not, the PK will include the parent
SetList theSet;
SetList
SepMap parent; //Part of PK. This can get complicated if the PK migrates all the way from TopLevel. We insert a surrogate key at this point.
String setMember; //Rest of PK
The database constraints ensure that the SetList is unique. The equivalent string may exist in different SetMaps, but may not be duplicated for a particular parent. -
How to map a collection of object in TopLink?
For (simple) example, I've a XSD that defines:
<xsd:complexType name="AttachmentType">
<xsd:sequence>
<xsd:element name="docID" nillable="false" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="MyDocType">
<xsd:sequence>
<xsd:element name="attachment" nillable="true" minOccurs="0"
maxOccurs="unbounded" type="tns:AttachmentType"/>
</xsd:sequence>
</xsd:complexType>
This XSD is referenced by a WSDL. Using JDeveloper to generate a Java Web Service using the WSDL and will get the following classes:
public class AttachmentType implements java.io.Serializable
protected java.lang.String docID;
public AttachmentType() { }
public java.lang.String getDocID() { return docID; }
public void setDocID(java.lang.String docID) { this.docID = docID; }
public class MyDocType implements java.io.Serializable
protected AttachmentType[] attachment;
public MyDocType () { }
public AttachmentType[] getAttachment() { return attachment; }
public void setAttachment(AttachmentType[] attachment)
this.attachment = attachment;
Now I want to generate a XML document from MyDocType. I use TopLink (JAXB) to do the mapping. However, how to map the 'attachment' of type AttachmentType[]? TopLink seems only allowing List/Set/Collection container options.
Anyone can help?
Note: I have to use the classes generated from WSDL.
Thanks!!Thanks. I'm using TopLink Workbench for the mapping
and have no idea on how to specify the XML
transformation mapping for array attribute. Can you
tell me more?I was putting together an example of the transformation mapping but came up with a better way. It turns out that a transformation mapping isn't ideal because you have to take over some of the responsibility for converting XML to objects. A better solution is to intercept the calls to the getter and setter for the AttachmentType[] and convert between an Array and List. Just map the Array as a composite collection in the workbench and customize the attachment attribute mapping in code.
Each mapping in TopLink has Accessor object responsible for getting and setting values in objects. If you choose method or direct access the mapping will have a different Accessor class. So the solution is to use an Accessor that converts the List TopLink builds into an Array of the correct type on set. On get, the Accessor creates a List from the Array.
You can introduce a custom Accessor using an After Load method. I've put a complete example up on my googlepages account[1]. The key code is listed below. Note that this code assumes you're using direct instance variable access. Also, this code works with TopLink 10.1.3.2 and the TopLink 11 preview. It won't work with previous versions.
The After Load class that changes the mapping accessor:
public class MyDocCustomizer {
public static void customize(ClassDescriptor descriptor) {
XMLCompositeCollectionMapping mapping = (XMLCompositeCollectionMapping)
descriptor.getMappingForAttributeName("attachment");
InstanceVariableAttributeAccessor existingAccessor =
(InstanceVariableAttributeAccessor) mapping.getAttributeAccessor();
ListArrayTransformationAccessor transformationAccessor =
new ListArrayTransformationAccessor(AttachmentType.class, "attachment");
transformationAccessor.initializeAttributes(descriptor.getJavaClass());
mapping.setAttributeAccessor(transformationAccessor);
}The custom InstanceVariableAccessor subclass:
public class ListArrayTransformationAccessor extends
InstanceVariableAttributeAccessor {
private Class arrayClass;
public ListArrayTransformationAccessor(Class arrayClass, String attributeName) {
super();
this.arrayClass = arrayClass;
this.setAttributeName(attributeName);
public Object getAttributeValueFromObject(Object anObject)
throws DescriptorException {
Object[] attributeValueFromObject =
(Object[]) super.getAttributeValueFromObject(anObject);
return Arrays.asList(attributeValueFromObject);
public void setAttributeValueInObject(Object anObject, Object value)
throws DescriptorException {
List collection = (List)value;
Object[] array = (Object[]) Array.newInstance(arrayClass, collection.size());
for (int i = 0; i < collection.size(); i++) {
Object element = collection.get(i);
Array.set(array, i, element);
super.setAttributeValueInObject(anObject, array);
}--Shaun
http://ontoplink.blogspot.com
[1] http://shaunmsmith.googlepages.com/Forum-519205-OXM-Array.zip -
Typesafe hetergeneous map to collection
I was trying to work out a variant of the Bruce Eckel's Typesafe Heterogeneous Container pattern where the map retrieved a collection of a given type. This works if I fix the collection type:
public class Favorites
private Map<Class<?>, Set<?>> favorites =
new HashMap<Class<?>, Set<?>>();
public <T> void setFavorite(Class<T> klass, Set<T> thing)
favorites.put(klass, thing);
@SuppressWarnings({"unchecked"})
public <T> Set<T> getFavorite(Class<T> klass)
return (Set<T>) favorites.get(klass);
public static void main(String[] args)
Favorites f = new Favorites();
final HashSet<String> strings = new HashSet<String>();
strings.add("Java"); strings.add("Code");
f.setFavorite(String.class, strings);
final HashSet<Integer> ints = new HashSet<Integer>();
ints.add(0xcafebabe); ints.add(1);
f.setFavorite(Integer.class, ints);
Set<String> s = f.getFavorite(String.class);
System.out.println(s);
Set<Integer> i = f.getFavorite(Integer.class);
System.out.println(i);
}but I would like to do something where I can parametrize Favorites on the collections class:
public class Favorites<C extends Collection<?>>
private Map<Class<?>, C<?>> favorites =
new HashMap<Class<?>, C<?>>();
public <T> void setFavorite(Class<T> klass, C<T> thing)
favorites.put(klass, thing);
@SuppressWarnings({"unchecked"})
public <T> C<T> getFavorite(Class<T> klass)
return (C<T>) favorites.get(klass);
public static void main(String[] args)
Favorites<Set> f = new Favorites<Set>();
final HashSet<String> strings = new HashSet<String>();
strings.add("Java"); strings.add("Code");
f.setFavorite(String.class, strings);
final HashSet<Integer> ints = new HashSet<Integer>();
ints.add(0xcafebabe); ints.add(1);
f.setFavorite(Integer.class, ints);
Set<String> s = f.getFavorite(String.class);
System.out.println(s);
Set<Integer> i = f.getFavorite(Integer.class);
System.out.println(i);
}However this won't compile because the compiler doesn't expect that "C" can itself take type parameters, even though I specified that it extended Collection<?>.
Is there any way to generify Favorites over the Collection class?BenSchulz wrote:
you may want look into [Super Type Tokens|http://gafter.blogspot.com/2006/12/super-type-tokens.html], but be aware of [their limitations|http://gafter.blogspot.com/2007/05/limitation-of-super-type-tokens.html].
That is really cool Ben. I never considered forcing reification through an abstract class and anonymous inner subclasses before.
I love Gafter. Most of the time I read something of his it's in the context of a smelly design (well, to be fair, most of what I've read comes from his puzzlers) but even so, without fail it leaves me with more insight into the language. -
Mapping error :Collecting file : BpmPatternCollectTime
Hi
I am trying to use Multimapping with BPM, for 3 files correlated based in some field value
but mY collectpattern is not workin, Workflow shows errror in Message Mapping Runtime exception
Attach Mapping
http://img255.imageshack.us/my.php?image=mappingaw1.jpg
Refered BPM from SAPBASIS
http://img413.imageshack.us/my.php?image=bpmsapbasisen1.jpg
steps relate to occurane in Source & target messaget type has been done..
but still the error is there...
I check the thread below , having the same issue and concern with BUG in display in SAP BASIS component display
BPM : Files are not appended in the container operation step
Regards
AshutoshRI got the issue..
After changing the occurance of target MT to 0..Unbounded..
the XML content for source messge type also changes..
1 Message Tag is also added to Source Message Type..
BUT the payload going as an input to this mapping is
not having the <Messages1> tag..
Here is the payload
in SXMB_moni before mapping
<?xml version="1.0" encoding="UTF-8"?>
<ns0:MT_Source_File xmlns:ns0="urn:godb:bw:01">
<row>
<Field1>first file</Field1>
<Field2>a</Field2>
<Field3>1</Field3>
<Field4>1</Field4>
<Field5>1</Field5>
</row>
</ns0:MT_Source_File>
XML payload copied from Message mapp TEST TAB
<?xml version="1.0" encoding="UTF-8"?>
<ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">
<ns0:Message1>
<ns1:MT_Source_File xmlns:ns1="urn:godb:bw:01">
<row>
<Field1/>
<Field2/>
<Field3/>
<Field4/>
<Field5/>
</row>
</ns1:MT_Source_File>
</ns0:Message1>
</ns0:Messages>
Regards,
AshutoshR -
Value Maps for Collections in Archiver missing some fields
Hi all,
I'm using Archiver and I need to map some of my folder metadata like the profile trigger but when I'm at the "Edit Value Maps" to map the old value to the new value for this field I find that the field I want is missing (in fact all fields that start with ColMeta. are missing.. something tells me these are the fields that are custom).
It does not let me do a custom query either! is there any way I can get this to work?
This field does appear for Content tho, it's just for folder/project metadata.
I'm looking into doing a "Field Map" from ColMeta.xProfileTrigger to some field available and then use that field for the value map but I'm not sure of the implications this will have in the field I choose since those others are fields used for something else and I don't want my mapping going to that other field.
Thanks for any help,
malkyWell nevermind I solved it, but I'll say how in case someone has the same problem:
Just create the archive with any field, then go and replace that field with the one you want everywhere in the archive.hda file.
If someone has a more elegant or better way to do this I'd like to hear it for future reference.
Cheers, -
Drag on map to collect all coordinates
Hi,
As far as I know and after looking at the mapviewer library, I feel that there is no way to attach mouse drag event with mapview. Please correct me if I'm wrong and let me know if there is a way in updated version of mapviewer to attach mouse drag event with mapview.
Best,
Tejas Gajera
Edited by: Tejas Gajera on Mar 11, 2010 11:51 AMHi Remo;
OSS number is 934848 and one more to check is 965386 and a bunch of document from all over but the problem is not see the data that i have but being connected to the backend system.
just type in BI Administrator and you will find about 5 PDF document pages, 15, 58, 61, 66 and 71. all these documents explains what this cockpit can do and a little how it does it.
any way BASIS has to configure BI, WAS and Jave to communicate with each other.
Backend system has to communicate with portal and it uses Java connectors and shows all the interactive pages using WAS.
I am having the same problem, it is not connecting i had it working in Dev but not in QA. if you find some new let me know and we will share the docs. -
How to use a MAP whithout join table
Hello
I am still evaluating KODO ;-)
I am using kodo 3.1.2 with an evaluation version
linux (kernel 2.6)
SUN JDK 1.4.2_04
MYSQL MAX 4.0.18 -Max
IDEA 4.0.3 and ANT 1.5.4 (to be exhaustive)
I am wondering how to configure the following mapping involving a Map. :
public class Translation {
private String locale;
private String txt;
public class TranslatableDescription {
/**Map of Key=locale as String; Value = {@link Translation}*/
==> private Map translations = new HashMap(); <==
public void addATranslation(Translation t){
translations.put(t.getLocale(), t);
file package.jdo :
<?xml version="1.0"?>
<jdo>
<package name="data">
<class name="Translation"/>
<class name="TranslatableDescription">
<field name="translations">
<map key-type="java.lang.String"
value-type="tutorial.data.Translation"/>
<extension vendor-name="kodo" key="jdbc-key-size" value="10"/>
</field>
</class>
</package>
</jdo>
The default Mapping generate a join table : TRANS_TRANSLATION which works
fine, but I would like to remove this table by adding a
colonne in the "TRANSLATION" table containing the JDOID of the
TRANSLATIONDESCRIPTION owner of this TRANSLATION.
I have made some try like this one in the mapping file
<class name="TranslatableDescription">
<field name="translations">
<jdbc-field-map type="n-many-map" key-column="LOCALE"
ref-column.JDOID="OWNERJDOID" table="TRANSLATION0"
value-column.JDOID="JDOID"/>
</field>
The schema generated in my DB is correct but when I try to persist some
objects I have the following Exception :
727 INFO [main] kodo.jdbc.JDBC - Using dictionary class
"kodo.jdbc.sql.MySQLDictionary" (MySQL 4.0.18'-Max' ,MySQL-AB JDBC Driver
mysql-connector-java-3.0.10-stable ( $Date: 2004/01/13 21:56:18 $,
$Revision: 1.27.2.33 $ )).
Exception in thread "main" kodo.util.FatalDataStoreException: Invalid
argument value, message from server: "Duplicate entry '2' for key 1"
{prepstmnt 8549963 INSERT INTO TRANSLATION0 (JDOID, LOCALESTR, OWNERJDOID)
VALUES (?, ?, ?) [reused=0]} [code=1062, state=S1009]
NestedThrowables:
com.solarmetric.jdbc.ReportingSQLException: Invalid argument value,
message from server: "Duplicate entry '2' for key 1" {prepstmnt 8549963
INSERT INTO TRANSLATION0 (JDOID, LOCALESTR, OWNERJDOID) VALUES (?, ?, ?)
[reused=0]} [code=1062, state=S1009]
java.sql.BatchUpdateException: Invalid argument value, message from
server: "Duplicate entry '2' for key 1"
at kodo.jdbc.sql.SQLExceptions.getFatalDataStore(SQLExceptions.java:42)
at kodo.jdbc.sql.SQLExceptions.getFatalDataStore(SQLExceptions.java:24)
at kodo.jdbc.runtime.JDBCStoreManager.flush(JDBCStoreManager.java:594)
at
kodo.runtime.DelegatingStoreManager.flush(DelegatingStoreManager.java:152)
at
kodo.runtime.PersistenceManagerImpl.flushInternal(PersistenceManagerImpl.java:964)
at
kodo.runtime.PersistenceManagerImpl.beforeCompletion(PersistenceManagerImpl.java:813)
at kodo.runtime.LocalManagedRuntime.commit(LocalManagedRuntime.java:69)
at
kodo.runtime.PersistenceManagerImpl.commit(PersistenceManagerImpl.java:542)
at
tutorial.CreateTranslatableDescription.main(CreateTranslatableDescription.java:48)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at com.intellij.rt.execution.application.AppMain.main(Unknown Source)
I have the feeling that KODO does try to make diffent row in the table
"TRANSLATION0" for the TRANSLATION and the MAP.
So, is this kind of mapping supported by KODO and if yes, how can I
configure it.
Thank you for your help
NicolasSo, is this kind of mapping supported by KODO and if yes, how can I
configure it.It is not directly supported. You can fake it using a one-many mapping
(see thread: Externalizing Map to Collection of PC), but unless you must
map to an existing schema, it's probably not worth the effort. (Note:
also there is a bug that actually prevents this from working with 3.1.2;
the bug is fixed for 3.1.3, but it hasn't been released yet). -
Huge performance differences between a map listener for a key and filter
Hi all,
I wanted to test different kind of map listener available in Coherence 3.3.1 as I would like to use it as an event bus. The result was that I found huge performance differences between them. In my use case, I have data which are time stamped so the full key of the data is the key which identifies its type and the time stamp. Unfortunately, when I had my map listener to the cache, I only know the type id but not the time stamp, thus I cannot add a listener for a key but for a filter which will test the value of the type id. When I launch my test, I got terrible performance results then I tried a listener for a key which gave me much better results but in my case I cannot use it.
Here are my results with a Dual Core of 2.13 GHz
1) Map Listener for a Filter
a) No Index
Create (data always added, the key is composed by the type id and the time stamp)
Cache.put
Test 1: Total 42094 millis, Avg 1052, Total Tries 40, Cache Size 80000
Cache.putAll
Test 2: Total 43860 millis, Avg 1096, Total Tries 40, Cache Size 80000
Update (data added then updated, the key is only composed by the type id)
Cache.put
Test 3: Total 56390 millis, Avg 1409, Total Tries 40, Cache Size 2000
Cache.putAll
Test 4: Total 51734 millis, Avg 1293, Total Tries 40, Cache Size 2000
b) With Index
Cache.put
Test 5: Total 39594 millis, Avg 989, Total Tries 40, Cache Size 80000
Cache.putAll
Test 6: Total 43313 millis, Avg 1082, Total Tries 40, Cache Size 80000
Update
Cache.put
Test 7: Total 55390 millis, Avg 1384, Total Tries 40, Cache Size 2000
Cache.putAll
Test 8: Total 51328 millis, Avg 1283, Total Tries 40, Cache Size 2000
2) Map Listener for a Key
Update
Cache.put
Test 9: Total 3937 millis, Avg 98, Total Tries 40, Cache Size 2000
Cache.putAll
Test 10: Total 1078 millis, Avg 26, Total Tries 40, Cache Size 2000
Please help me to find what is wrong with my code because for now it is unusable.
Best Regards,
Nicolas
Here is my code
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import com.tangosol.io.ExternalizableLite;
import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;
import com.tangosol.util.Filter;
import com.tangosol.util.MapEvent;
import com.tangosol.util.MapListener;
import com.tangosol.util.extractor.ReflectionExtractor;
import com.tangosol.util.filter.EqualsFilter;
import com.tangosol.util.filter.MapEventFilter;
public class TestFilter {
* To run a specific test, just launch the program with one parameter which
* is the test index
public static void main(String[] args) {
if (args.length != 1) {
System.out.println("Usage : java TestFilter 1-10|all");
System.exit(1);
final String arg = args[0];
if (arg.endsWith("all")) {
for (int i = 1; i <= 10; i++) {
test(i);
} else {
final int testIndex = Integer.parseInt(args[0]);
if (testIndex < 1 || testIndex > 10) {
System.out.println("Usage : java TestFilter 1-10|all");
System.exit(1);
test(testIndex);
@SuppressWarnings("unchecked")
private static void test(int testIndex) {
final NamedCache cache = CacheFactory.getCache("test-cache");
final int totalObjects = 2000;
final int totalTries = 40;
if (testIndex >= 5 && testIndex <= 8) {
// Add index
cache.addIndex(new ReflectionExtractor("getKey"), false, null);
// Add listeners
for (int i = 0; i < totalObjects; i++) {
final MapListener listener = new SimpleMapListener();
if (testIndex < 9) {
// Listen to data with a given filter
final Filter filter = new EqualsFilter("getKey", i);
cache.addMapListener(listener, new MapEventFilter(filter), false);
} else {
// Listen to data with a given key
cache.addMapListener(listener, new TestObjectSimple(i), false);
// Load data
long time = System.currentTimeMillis();
for (int iTry = 0; iTry < totalTries; iTry++) {
final long currentTime = System.currentTimeMillis();
final Map<Object, Object> buffer = new HashMap<Object, Object>(totalObjects);
for (int i = 0; i < totalObjects; i++) {
final Object obj;
if (testIndex == 1 || testIndex == 2 || testIndex == 5 || testIndex == 6) {
// Create data with key with time stamp
obj = new TestObjectComplete(i, currentTime);
} else {
// Create data with key without time stamp
obj = new TestObjectSimple(i);
if ((testIndex & 1) == 1) {
// Load data directly into the cache
cache.put(obj, obj);
} else {
// Load data into a buffer first
buffer.put(obj, obj);
if (!buffer.isEmpty()) {
cache.putAll(buffer);
time = System.currentTimeMillis() - time;
System.out.println("Test " + testIndex + ": Total " + time + " millis, Avg " + (time / totalTries) + ", Total Tries " + totalTries + ", Cache Size " + cache.size());
cache.destroy();
public static class SimpleMapListener implements MapListener {
public void entryDeleted(MapEvent evt) {}
public void entryInserted(MapEvent evt) {}
public void entryUpdated(MapEvent evt) {}
public static class TestObjectComplete implements ExternalizableLite {
private static final long serialVersionUID = -400722070328560360L;
private int key;
private long time;
public TestObjectComplete() {}
public TestObjectComplete(int key, long time) {
this.key = key;
this.time = time;
public int getKey() {
return key;
public void readExternal(DataInput in) throws IOException {
this.key = in.readInt();
this.time = in.readLong();
public void writeExternal(DataOutput out) throws IOException {
out.writeInt(key);
out.writeLong(time);
public static class TestObjectSimple implements ExternalizableLite {
private static final long serialVersionUID = 6154040491849669837L;
private int key;
public TestObjectSimple() {}
public TestObjectSimple(int key) {
this.key = key;
public int getKey() {
return key;
public void readExternal(DataInput in) throws IOException {
this.key = in.readInt();
public void writeExternal(DataOutput out) throws IOException {
out.writeInt(key);
public int hashCode() {
return key;
public boolean equals(Object o) {
return o instanceof TestObjectSimple && key == ((TestObjectSimple) o).key;
}Here is my coherence config file
<?xml version="1.0"?>
<!DOCTYPE cache-config SYSTEM "cache-config.dtd">
<cache-config>
<caching-scheme-mapping>
<cache-mapping>
<cache-name>test-cache</cache-name>
<scheme-name>default-distributed</scheme-name>
</cache-mapping>
</caching-scheme-mapping>
<caching-schemes>
<distributed-scheme>
<scheme-name>default-distributed</scheme-name>
<backing-map-scheme>
<class-scheme>
<scheme-ref>default-backing-map</scheme-ref>
</class-scheme>
</backing-map-scheme>
</distributed-scheme>
<class-scheme>
<scheme-name>default-backing-map</scheme-name>
<class-name>com.tangosol.util.SafeHashMap</class-name>
</class-scheme>
</caching-schemes>
</cache-config>Message was edited by:
user620763Hi Robert,
Indeed, only the Filter.evaluate(Object obj)
method is invoked, but the object passed to it is a
MapEvent.<< In fact, I do not need to implement EntryFilter to
get a MapEvent, I could get the same result (in my
last message) by writting
cache.addMapListener(listener, filter,
true)instead of
cache.addMapListener(listener, new
MapEventFilter(filter) filter, true)
I believe, when the MapEventFilter delegates to your filter it always passes a value object to your filter (old or new), meaning a value will be deserialized.
If you instead used your own filter, you could avoid deserializing the value which usually is much larger, and go to only the key object. This would of course only be noticeable if you indeed used a much heavier cached value class.
The hashCode() and equals() does not matter on
the filter class<< I'm not so sure since I noticed that these methods
were implemented in the EqualsFilter class, that they
are called at runtime and that the performance
results are better when you add them
That interests me... In what circumstances did you see them invoked? On the storage node before sending an event, or upon registering a filtered listener?
If the second, then I guess the listeners are stored in a hash-based map of collections keyed by a filter, and indeed that might be relevant as in that case it will cause less passes on the filter for multiple listeners with an equalling filter.
DataOutput.writeInt(int) writes 4 bytes.
ExternalizableHelper.writeInt(DataOutput, int) writes
1-5 bytes (or 1-6?), with numbers with small absolute
values consuming less bytes.Similar differences exist
for the long type as well, but your stamp attribute
probably will be a large number...<< I tried it but in my use case, I got the same
results. I guess that it must be interesting, if I
serialiaze/deserialiaze many more objects.
Also, if Coherence serializes an
ExternalizableLite object, it writes out its
class-name (except if it is a Coherence XmlBean). If
you define your key as an XmlBean, and add your class
into the classname cache configuration in
ExternalizableHelper.xml, then instead of the
classname, only an int will be written. This way you
can spare a large percentage of bandwidth consumed by
transferring your key instance as it has only a small
number of attributes. For the value object, it might
or might not be so relevant, considering that it will
probably contain many more attributes. However, in
case of a lite event, the value is not transferred at
all.<< I tried it too and in my use case, I noticed that
we get objects nearly twice lighter than an
ExternalizableLite object but it's slower to get
them. But it is very intersting to keep in mind, if
we would like to reduce the network traffic.
Yes, these are minor differences at the moment.
As for the performance of XMLBean, it is a hack, but you might try overriding the readExternal/writeExternal method with your own usual ExternalizableLite implementation stuff. That way you get the advantages of the xmlbean classname cache, and avoid its reflection-based operation, at the cost of having to extend XMLBean.
Also, sooner or later the TCMP protocol and the distributed cache storages will also support using PortableObject as a transmission format, which enables using your own classname resolution and allow you to omit the classname from your objects. Unfortunately, I don't know when it will be implemented.
>
But finally, I guess that I found the best solution
for my specific use case which is to use a map
listener for a key which has no time stamp, but since
the time stamp is never null, I had just to check
properly the time stamp in the equals method.
I would still recommend to use a separate key class, use a custom filter which accesses only the key and not the value, and if possible register a lite listener instead of a heavy one. Try it with a much heavier cached value class where the differences are more pronounced.
Best regards,
Robert -
How to keep the original sequence of a map
I want the equivalent of a Hashtable or Map class (I need keys and corresponding objects) which, once fully populated, will guarantee to get the key/object pairs back out using the order in which they were added, rather than by sort order of the keys.
( The bigger objective is to compare two such collections, A and B, to see which key/object pairs exist in A but not B, and which exist in B but not A. However, for presentation purposes, I need to keep the original order in which everything was read.)
What's the most efficient way to do this ? I'm sure I've missed something really simplistic but, hey, it's Monday......There is no way to retrieve objects from any map in the order they were incerted unless you add some logic to the way you are incering it.
Here is an example of such logic, where I want to retrieve "states" in the same order as I put them:
public static void main(String[] args){
HashMap map = new HashMap();
map.put("1" + "PA", "Pensylvania");
map.put("2" + "NJ", "New Jersey");
map.put("3" + "CA", "California");
map.put("4" + "TX", "Texas");
LinkedList ls = new LinkedList(map.keySet());
Collections.sort(ls);
Iterator iter = ls.iterator();
String stAbbrv = null;
while (iter.hasNext()){
stAbbrv = (String)iter.next();
System.out.println(stAbbrv.substring(1) + " - " + map.get(stAbbrv));
}the output is:
PA - Pensylvania
NJ - New Jersey
CA - California
TX - TexasHope it helps
Alex
[email protected] -
Multi-Mapping Message Split 1:n
Hi experts,
I have a few questions regarding a multi-mapping for a 1:n message split. I have a business process which collects IDOCs from a specific IDOC type (ZHINVOIC01).
I have a 1-to-1 Mapping for collecting the IDOCs.
After this 1-to-1 Mapping the IDOC has the following structure:
xdoc has the occurrence 0..unbounded
For every IDOC in the source structure one xdoc in the target structure should be created. My Mapping works very fine, but I have one question. If there are more IDOC-Elements in the source structure, I have more xdoc-Elements in the target structure. But I do not want to have one target-message. the mapping should create one file with the element xdoc for every IDOC element in the source structure.
I want to send a xml-file for each xdoc-element to a ftp-server. is that possible?
Thanks and best regards
Christopher KühnHi Udo,
look at my example above:
for the source structure
<Messages>
<Message1>
<ZHINVOIC01>
<IDOC/>
<IDOC/>
<IDOC/>
</ZHINVOIC01>
</Message1>
</Messages>
I have the following target structure:
<Messages>
<Message1>
<xdoc/>
<xdoc/>
<xdoc/>
<Message1>
<Messages>
now the target structure is only one message, isn't it?
But I want to have for this case 3 Messages each with only one xdoc-element.
I hope that we are not talking at cross-purposes
Thanks and best regards
Christopher -
Insert called before delete in a collection with unique constraint
Hi all,
I have a simple @OneToMany private mapping:
private Collection<Item> items;
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
public Collection<Item> getItems() {
return items;
public void setItems(Collection<Item> items) {
this.items = items;
public void customize(ClassDescriptor classDescriptor) throws Exception {
OneToManyMapping mapping = (OneToManyMapping)
classDescriptor.getMappingForAttributeName("items");
mapping.privateOwnedRelationship();
I have a unique constraint on my Items table that a certain value cannot be duplicated.
My problem appears when I remove a previously saved item from the collection and add a new item containing the same data, at the same time.
After I save the parent and do a flush, I receive SQLIntegrityConstraintViolationException because TopLink performs first an insert query instead of deleting the existing item.
I tested the application and everything went fine with: remove item / save parent / insert item / save parent
I checked on the Internet and the documentation but didn't find anything similar to my problem. I tried debugging TopLink's internal calls but I'm missing some general ideas about all the inner workings and don't know what to look for. I use TopLink version: Oracle TopLink Essentials - 2.1 (Build b60e-fcs (12/23/2008))
Does anyone have a hint of what to look for?
Edited by: wise_guybg on Sep 25, 2009 4:01 PM
Edited by: wise_guybg on Oct 5, 2009 11:22 AMThank you for the suggestions James
As I mentioned briefly I have done some debugging but couldn't understand how collections are updated. What I did find out is that setShouldPerformDeletesFirst() doesn't come into play in this case because this is not a consecutive change on entities.
What I have in my case is a collection inside an entity that the user has tampered with and now TopLink has to do a merge. I cannot call flush() in the middle since the user has not approved that the changes made to the entity should be saved.
I see that for TopLink it's not easy to figure out the order in which changes were made to a collection. Here is pseudo-code of when the constraint is touched:
entity.items.remove(a)
entity.items.add(b)
merge(entity)
And here is code that executes without a problem:
entity.items.remove(a)
merge(entity)
entity.items.add(b)
merge(entity)
So once again, I think that collection changes are managed differently but I don't find a way to tell TopLink how to handle them. Any ideas? -
Power Map has encountered an error and it needs to close, after changing the graphic settings
I've been using the updated Power Map tool successfully over the past few days.
Last night I was playing around with the graphics settings that can be found under the File Tab (I know that should teach me from playing around and following the user guide :-) ) and I changed the detail from Medium to High (I think) and now all that happens
when I click on create a new tour or select an existing tour is
"Power Map has encountered an error and it needs to close. Power Map can collection information about the error and create an e-mail which you will be able to send to Microsoft and help us fix the problem. Do you want to do this?"
The error that gets generated can be seen below.
Thank you for submitting this error information to Microsoft. We appreciate your help!
System.Exception: Could not create the render target shared resource.
at Microsoft.Data.Visualization.Engine.Graphics.Internal.D3DImage11.SetBackBuffer11(IntPtr pResource)
at Microsoft.Data.Visualization.Engine.Graphics.D3DImage11.SetBackBuffer(RenderTarget renderTarget)
at Microsoft.Data.Visualization.VisualizationControls.GlobeViewModel.CompositionTarget_Rendering(Object sender, EventArgs e)
at System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget)
at System.Windows.Media.MediaContext.AnimatedRenderMessageHandler(Object resizedCompositionTarget)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
I've removed Power Map from the system, restarted, repaired Office, restarted and reinstalled Power Map but the problem remains. So i'm guessing that the setting I changed are stored in the Registry or File System somewhere.
Any help would be gratefully received.
Regards
Rob IrelandIs this still an issue?
This also might be worthy to send to the team as a bug.
You can send it in email using the Smile/Frown feature in the UI.
Thanks!
Ed Price, Power BI & SQL Server Customer Program Manager (Blog,
Small Basic,
Wiki Ninjas,
Wiki)
Answer an interesting question?
Create a wiki article about it! -
Problem with castor xml mapping
Hi,
we have following problem with castor xml mapping.
How to use references in the collections(Hashmap or vector)?
WE have a method called getAttribute map which will return a hashmap consist different type of objects. We want to keep only the
references of objects if that object occurs more than once,instead of keeping the whole object
Following is the the xml mapping file.
<mapping>
<class name="com.opvista.ndtool.core.mos.ManagedObject" identity="Id" auto-complete="false" verify-constructable="false">
<map-to xml="ManagedObject"/>
<field name="Id" get-method="getId" set-method="setId" type="string">
<bind-xml name="Id" node="attribute"/>
</field>
<field name="AttributeMap" type="org.exolab.castor.mapping.MapItem" collection="map" get-method="getAttributeMap">
<bind-xml name="AttributeMap" node="element">
<class name="org.exolab.castor.mapping.MapItem">
<field name="key" type="java.lang.Object">
<bind-xml name="key" node="attribute"/>
</field>
<field name="value" type="java.lang.Object">
<bind-xml name="value" node="element" reference="true"/>
</field>
</class>
</bind-xml>
</field>
</class>
</mapping>
we are using reference=true for the values. But it will throw below exception.
Unable to resolve ID for instance of class 'java.lang.String' due to the following error: Unable to resolve ClassDescriptor.
at org.exolab.castor.xml.Marshaller.getObjectID(Marshaller.java:1988)
at org.exolab.castor.xml.Marshaller.marshal(Marshaller.java:1628)
at org.exolab.castor.xml.Marshaller.marshal(Marshaller.java:1831)
at org.exolab.castor.xml.Marshaller.marshal(Marshaller.java:1814)
at org.exolab.castor.xml.Marshaller.marshal(Marshaller.java:1825)
at org.exolab.castor.xml.Marshaller.marshal(Marshaller.java:821)
Please help us to overcome from this problem?
Thanks,
Dileepfor your ref here is what i think the basic mapping file would look like
<class name="Person">
<map-to xml="person"/>
<field name="name" type="string">
<bind-xml name="name" node="attribute" />
</field>
<field name="age" type="string">
<bind-xml name="age" node="attribute" />
</field>
</class>
<class name="MetaPerson">
<map-to xml="person"/>
<field name="dependents" type="string">
<bind-xml name="dependents" node="attribute" />
</field>
<field name="presentAdd" type="string">
<bind-xml name="present_add " node="attribute" />
</field>
<field name="permanentAdd" type="string">
<bind-xml name="permanent_add " node="attribute" />
</field>
</class>
however i am still not clear as to how i can use the metaperson object in the person class as well as in the mapping file.
hope this gives a better idea abt my problem statement.
Please help me out
Maybe you are looking for
-
Mixing RAM Manufacturers?
My apologies if this has been asked before; I searched the forum but couldn't find anything that answered my question properly. So-called 3rd party Memory is new territory for me. I'm looking to upgrade the RAM in my iMac at home; it's a late 2006 20
-
TS4268 Why i cant use my iMessage in my ipad mini? I use the same id and password in my iphone
Someone help me with the problem i have. I cant log in into my iMessage in my iPad mini using the same account i am using in my iPhone. I checked the spelling of the password and username they are all correct but still i cant use it on iMessage. Some
-
Migration database will be impacted to mappings?
Dear Experts, We are planning to migrate from one database to other database and we have the existing Integration Server with 40 interfaces with the different mappings(ABAP, XSLT, Java and Message Mapping). How does the impact with the mappings or ot
-
How can I Create return order with reference to an ARCHIVED invoice
The standard "Reference" process does not work when the invoice has been archived. Has anyone solved this problem?
-
WHERE clause for Materialized View
Hi, We are replicating a very large table from Production. The table is approx 40Gb in size and so the DBA's are very reluctant to do a full replication as it could bring down the production server (I'm a developer so I'm going on faith this is corre