/* * 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.rebind.api.model; import org.jboss.errai.codegen.meta.MetaClass; import org.jboss.errai.codegen.meta.impl.java.JavaReflectionClass; import org.jboss.errai.marshalling.client.api.Marshaller; import org.jboss.errai.marshalling.rebind.api.model.impl.NoConstructMapping; import org.jboss.errai.marshalling.rebind.api.model.impl.SimpleConstructorMapping; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; /** * @author Mike Brock */ public class MappingDefinition { private final MetaClass toMap; private boolean lazy; private final boolean doNotGenerate; private Class<? extends Marshaller> clientMarshallerClass; private Class<? extends Marshaller> serverMarshallerClass; private Marshaller<Object> marshallerInstance; private InstantiationMapping instantiationMapping; private final List<MemberMapping> memberMappings; public MappingDefinition(final Marshaller<Object> marshaller, final MetaClass toMap, final boolean doNotGenerate) { this.toMap = toMap; setMarshallerInstance(marshaller); instantiationMapping = new NoConstructMapping(); this.doNotGenerate = doNotGenerate; this.memberMappings = new ArrayList<MemberMapping>(); } protected MappingDefinition(final Class<?> toMap) { this(toMap, false); } public MappingDefinition(final Class<?> toMap, final boolean doNotGenerate) { this(JavaReflectionClass.newUncachedInstance(toMap), doNotGenerate); } public MappingDefinition(final MetaClass toMap, final boolean doNotGenerate) { this.toMap = toMap; setInstantiationMapping(new SimpleConstructorMapping()); this.doNotGenerate = doNotGenerate; this.memberMappings = new ArrayList<MemberMapping>(); } public MetaClass getMappingClass() { return toMap; } public Class<? extends Marshaller> getClientMarshallerClass() { return clientMarshallerClass; } public void setClientMarshallerClass(final Class<? extends Marshaller> clientMarshallerClass) { this.clientMarshallerClass = clientMarshallerClass; } public Class<? extends Marshaller> getServerMarshallerClass() { return serverMarshallerClass; } public void setServerMarshallerClass(final Class<? extends Marshaller> serverMarshallerClass) { this.serverMarshallerClass = serverMarshallerClass; } public boolean alreadyGenerated() { return doNotGenerate; } public void setInstantiationMapping(final InstantiationMapping mapping) { mapping.setMappingClass(toMap); instantiationMapping = mapping; } public void setInheritedInstantiationMapping(final InstantiationMapping mapping) { instantiationMapping = mapping; } public void addMemberMapping(final MemberMapping mapping) { mapping.setMappingClass(toMap); memberMappings.add(mapping); } public void addInheritedMapping(final MemberMapping mapping) { memberMappings.add(mapping); } public InstantiationMapping getInstantiationMapping() { return instantiationMapping; } public List<MemberMapping> getMemberMappings() { return memberMappings; } private volatile List<MemberMapping> _readableMemberMappingsCache; public List<MemberMapping> getReadableMemberMappings() { if (_readableMemberMappingsCache != null) { return _readableMemberMappingsCache; } final List<MemberMapping> readableMemberMappings = new ArrayList<MemberMapping>(); for (final MemberMapping memberMapping : memberMappings) { if (memberMapping.canRead()) { readableMemberMappings.add(memberMapping); } } return _readableMemberMappingsCache = Collections.unmodifiableList(readableMemberMappings); } private volatile List<MemberMapping> _writableMemberMappingsCache; public List<MemberMapping> getWritableMemberMappings() { if (_writableMemberMappingsCache != null) { return _writableMemberMappingsCache; } final List<MemberMapping> writableMemberMappings = new ArrayList<MemberMapping>(); for (final MemberMapping memberMapping : memberMappings) { if (memberMapping.canWrite()) { writableMemberMappings.add(memberMapping); } } return _writableMemberMappingsCache = Collections.unmodifiableList(writableMemberMappings); } public Marshaller<Object> getMarshallerInstance() { return marshallerInstance; } public void setMarshallerInstance(final Marshaller marshallerInstance) { this.marshallerInstance = marshallerInstance; } public List<Mapping> getAllMappings() { final List<Mapping> mappingList = new ArrayList<Mapping>(); if (getInstantiationMapping() != null) { mappingList.addAll(Arrays.asList(getInstantiationMapping().getMappings())); } mappingList.addAll(getMemberMappings()); return Collections.unmodifiableList(mappingList); } public boolean isLazy() { return lazy; } public void setLazy(boolean lazy) { this.lazy = lazy; } @Override public String toString() { return "MappingDefinition [mappingClass=" + getMappingClass() + ", clientMarshallerClass=" + getClientMarshallerClass() + ", serverMarshallerClass=" + getServerMarshallerClass() + "]"; } }