/*
* Copyright 2015 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.
*
* 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.kie.server.api.marshalling;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.kie.server.api.commands.CommandScript;
import org.kie.server.api.commands.DescriptorCommand;
import org.kie.server.api.model.KieServerCommand;
import org.kie.server.api.model.type.JaxbBoolean;
import org.kie.server.api.model.type.JaxbByte;
import org.kie.server.api.model.type.JaxbByteArray;
import org.kie.server.api.model.type.JaxbCharacter;
import org.kie.server.api.model.type.JaxbDate;
import org.kie.server.api.model.type.JaxbDouble;
import org.kie.server.api.model.type.JaxbFloat;
import org.kie.server.api.model.type.JaxbInteger;
import org.kie.server.api.model.type.JaxbList;
import org.kie.server.api.model.type.JaxbLong;
import org.kie.server.api.model.type.JaxbMap;
import org.kie.server.api.model.type.JaxbShort;
import org.kie.server.api.model.type.JaxbString;
public class ModelWrapper {
protected static Map<Class, Class> wrapperPrimitives = new HashMap<Class, Class>();
static {
wrapperPrimitives.put(Boolean.class, JaxbBoolean.class);
wrapperPrimitives.put(Byte.class, JaxbByte.class);
wrapperPrimitives.put(Character.class, JaxbCharacter.class);
wrapperPrimitives.put(Short.class, JaxbShort.class);
wrapperPrimitives.put(Integer.class, JaxbInteger.class);
wrapperPrimitives.put(Long.class, JaxbLong.class);
wrapperPrimitives.put(Double.class, JaxbDouble.class);
wrapperPrimitives.put(Float.class, JaxbFloat.class);
wrapperPrimitives.put(String.class, JaxbString.class);
wrapperPrimitives.put(byte[].class, JaxbByteArray.class);
}
public static Object wrap(Object object) {
if (object != null && isPrimitiveOrWrapper(object.getClass())) {
return wrapPrimitive(object);
}
return wrapSkipPrimitives(object);
}
public static Object wrapSkipPrimitives(Object object) {
if (object instanceof List) {
return new JaxbList((List) object);
} else if (object instanceof Map) {
return new JaxbMap((Map) object);
} else if (object instanceof Date) {
return new JaxbDate((Date) object);
} else if (object instanceof CommandScript) {
for (KieServerCommand cmd : ((CommandScript) object).getCommands()) {
if (cmd instanceof DescriptorCommand) {
List<Object> arguments = new ArrayList<Object>();
for (Object o : ((DescriptorCommand) cmd).getArguments()) {
arguments.add(wrap(o));
}
((DescriptorCommand) cmd).setArguments(arguments);
}
}
}
return object;
}
static boolean isPrimitiveOrWrapper(final Class<?> type) {
if (type == null) {
return false;
}
return type.isPrimitive() || wrapperPrimitives.containsKey(type);
}
static Object wrapPrimitive(final Object value) {
try {
Class<?> wrapperClass = wrapperPrimitives.get(value.getClass());
Constructor c = wrapperClass.getConstructor(value.getClass());
return c.newInstance(value);
} catch (Exception e) {
throw new RuntimeException("Unable to create wrapper for type " + value.getClass() + " with value " + value);
}
}
}