178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson/** 278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * Copyright 2006-2013 the original author or authors. 378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * 478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * Licensed under the Apache License, Version 2.0 (the "License"); 578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * you may not use this file except in compliance with the License. 678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * You may obtain a copy of the License at 778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * 878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * http://www.apache.org/licenses/LICENSE-2.0 978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * 1078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * Unless required by applicable law or agreed to in writing, software 1178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * distributed under the License is distributed on an "AS IS" BASIS, 1278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * See the License for the specific language governing permissions and 1478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * limitations under the License. 1578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson */ 1678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonpackage org.objenesis.strategy; 1778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson 1878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport java.io.NotSerializableException; 1978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport java.io.Serializable; 2078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson 2178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.ObjenesisException; 2278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.instantiator.ObjectInstantiator; 2378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.instantiator.android.AndroidSerializationInstantiator; 2478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.instantiator.basic.ObjectStreamClassInstantiator; 2578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.instantiator.gcj.GCJSerializationInstantiator; 2678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.instantiator.perc.PercSerializationInstantiator; 2778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.instantiator.sun.Sun13SerializationInstantiator; 2878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson 2978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson/** 3078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * Guess the best serializing instantiator for a given class. The returned instantiator will 3178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * instantiate classes like the genuine java serialization framework (the constructor of the first 3278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * not serializable class will be called). Currently, the selection doesn't depend on the class. It 3378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * relies on the 3478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * <ul> 3578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * <li>JVM version</li> 3678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * <li>JVM vendor</li> 3778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * <li>JVM vendor version</li> 3878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * </ul> 3978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * However, instantiators are stateful and so dedicated to their class. 4078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * 4178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * @author Henri Tremblay 4278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * @see ObjectInstantiator 4378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson */ 4478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonpublic class SerializingInstantiatorStrategy extends BaseInstantiatorStrategy { 4578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson 4678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson /** 4778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * Return an {@link ObjectInstantiator} allowing to create instance following the java 4878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * serialization framework specifications. 4978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * 5078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * @param type Class to instantiate 5178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * @return The ObjectInstantiator for the class 5278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson */ 5378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson public ObjectInstantiator newInstantiatorOf(Class type) { 5478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson if(!Serializable.class.isAssignableFrom(type)) { 5578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson throw new ObjenesisException(new NotSerializableException(type+" not serializable")); 5678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 5778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson if(JVM_NAME.startsWith(SUN)) { 5878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson if(VM_VERSION.startsWith("1.3")) { 5978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson return new Sun13SerializationInstantiator(type); 6078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 6178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 6278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson else if(JVM_NAME.startsWith(DALVIK)) { 6378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson return new AndroidSerializationInstantiator(type); 6478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 6578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson else if(JVM_NAME.startsWith(GNU)) { 6678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson return new GCJSerializationInstantiator(type); 6778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 6878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson else if(JVM_NAME.startsWith(PERC)) { 6978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson return new PercSerializationInstantiator(type); 7078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 7178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson 7278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson return new ObjectStreamClassInstantiator(type); 7378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson } 7478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson 7578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson} 76