/* * Copyright (C) 2011 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jboss.errai.marshalling.client.api; import java.util.HashMap; import java.util.IdentityHashMap; import java.util.Map; import org.jboss.errai.common.client.api.Assert; import org.jboss.errai.marshalling.client.api.json.EJValue; import org.jboss.errai.marshalling.client.util.MarshallUtil; /** * @author Mike Brock */ public abstract class AbstractMarshallingSession implements MarshallingSession { private final MappingContext context; private final Map<Object, Integer> objects = new IdentityHashMap<Object, Integer>(); private final Map<String, Object> objectMap = new HashMap<String, Object>(); private String assumedElementType = null; private String assumedMapKeyType = null; private String assumedMapValueType = null; protected AbstractMarshallingSession(final MappingContext context) { this.context = Assert.notNull(context); } private static final Marshaller<Object> NULL_MARSHALLER = new Marshaller<Object>() { @Override public Object demarshall(final EJValue o, final MarshallingSession ctx) { return null; } @Override public String marshall(final Object o, final MarshallingSession ctx) { return "null"; } @Override public Object[] getEmptyArray() { return new Object[0]; } }; @Override public Marshaller<Object> getMarshallerInstance(final String fqcn) { Marshaller<Object> marshaller = context.getMarshaller(fqcn); if (marshaller == null) { if (fqcn == null) { return NULL_MARSHALLER; } if (fqcn.startsWith("[")) { marshaller = context.getMarshaller(MarshallUtil.getComponentClassName(fqcn)); if (marshaller != null) { marshaller = new ArrayMarshallerWrapper(marshaller); } } } return marshaller; } @Override public MappingContext getMappingContext() { return context; } @Override public boolean hasObject(final String hashCode) { return objectMap.containsKey(hashCode); } @Override public boolean hasObject(final Object reference) { return reference != null && objects.containsKey(reference); } @Override public <T> T getObject(final Class<T> type, final String hashCode) { return (T) objectMap.get(hashCode); } @Override public <T> T recordObject(final String hashCode, final T instance) { if ("-1".equals(hashCode)) return instance; objectMap.put(hashCode, instance); return instance; } @Override public String getObject(final Object reference) { Integer i = objects.get(reference); if (i == null) { objects.put(reference, (i = objects.size() + 1)); recordObject(i.toString(), reference); } return i.toString(); } @Override public String getAssumedElementType() { return this.assumedElementType; } @Override public void setAssumedElementType(final String assumendElementType) { this.assumedElementType = assumendElementType; } @Override public String getAssumedMapKeyType() { return this.assumedMapKeyType; } @Override public void setAssumedMapKeyType(String assumedMapKeyType) { this.assumedMapKeyType = assumedMapKeyType; } @Override public String getAssumedMapValueType() { return this.assumedMapValueType; } @Override public void setAssumedMapValueType(String assumedMapValueType) { this.assumedMapValueType = assumedMapValueType; } @Override public void resetAssumedTypes() { this.assumedMapKeyType = null; this.assumedMapValueType = null; this.assumedElementType = null; } }