org.openengsb.persistence.connector.jpabackend.ConnectorPropertiesWrapperJPAEntity.java Source code

Java tutorial

Introduction

Here is the source code for org.openengsb.persistence.connector.jpabackend.ConnectorPropertiesWrapperJPAEntity.java

Source

/**
 * Licensed to the Austrian Association for Software Tool Integration (AASTI)
 * under one or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information regarding copyright
 * ownership. The AASTI licenses this file to you 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.openengsb.persistence.connector.jpabackend;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OrderColumn;

import org.apache.commons.lang.ClassUtils;
import org.openengsb.core.api.persistence.PersistenceException;

/**
 * This is a wrapper class around Connector properties to make them available for JPA persistence. Connector properties
 * can be: primitive types, all types where the object is reconstructable via String constructor and Arrays or
 * Collections of those types.
 * 
 */
@Entity(name = "CONNECTOR_PROPERTIES_WRAPPER")
public class ConnectorPropertiesWrapperJPAEntity {

    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    private Long id;

    @Column(name = "COLLECTION_TYPE", length = 127)
    private String collectionType;
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @OrderColumn
    private List<ConnectorPropertyJPAEntity> properties;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getCollectionType() {
        return collectionType;
    }

    public void setCollectionType(String collectionType) {
        this.collectionType = collectionType;
    }

    public List<ConnectorPropertyJPAEntity> getProperties() {
        return properties;
    }

    public void setProperties(List<ConnectorPropertyJPAEntity> properties) {
        this.properties = properties;
    }

    @SuppressWarnings("unchecked")
    public static ConnectorPropertiesWrapperJPAEntity getFromObject(Object property) {
        Class<?> clazz = property.getClass();

        ConnectorPropertiesWrapperJPAEntity wrapper = new ConnectorPropertiesWrapperJPAEntity();

        List<ConnectorPropertyJPAEntity> propList = new ArrayList<ConnectorPropertyJPAEntity>();
        wrapper.setProperties(propList);
        wrapper.setCollectionType(clazz.getName());

        if (clazz.isArray()) {
            Object[] arr;
            Class<?> compClass = clazz.getComponentType();
            if (compClass.isPrimitive()) {
                compClass = ClassUtils.primitiveToWrapper(compClass);
                int length = Array.getLength(property);
                Object wrapperArray = Array.newInstance(compClass, length);
                for (int i = 0; i < length; i++) {
                    Array.set(wrapperArray, i, Array.get(property, i));
                }
                arr = (Object[]) wrapperArray;
            } else {
                arr = (Object[]) property;
            }
            loopProperties(Arrays.asList(arr), propList);
            return wrapper;
        } else {
            if (Collection.class.isAssignableFrom(clazz)) {
                Collection<Object> coll = (Collection<Object>) property;
                loopProperties(coll, propList);
                return wrapper;
            } else {
                wrapper.setCollectionType(null);
                propList.add(ConnectorPropertyJPAEntity.getFromObject(property));
                return wrapper;
            }
        }
    }

    @SuppressWarnings("unchecked")
    public Object toObject() throws PersistenceException {
        if (collectionType == null) {
            ConnectorPropertyJPAEntity entity = properties.toArray(new ConnectorPropertyJPAEntity[1])[0];
            return entity.toObject();
        }
        try {
            Class<?> collectionClass = Class.forName(collectionType);
            if (collectionClass.isArray()) {
                Object arr = Array.newInstance(collectionClass.getComponentType(), properties.size());
                int i = 0;
                for (ConnectorPropertyJPAEntity entity : properties) {
                    Array.set(arr, i, entity.toObject());
                    i++;
                }
                return arr;
            } else {
                Collection<Object> collection = (Collection<Object>) collectionClass.newInstance();
                for (ConnectorPropertyJPAEntity entity : properties) {
                    collection.add(entity.toObject());
                }
                return collection;
            }
        } catch (ClassNotFoundException e) {
            throw new PersistenceException(e);
        } catch (InstantiationException e) {
            throw new PersistenceException(e);
        } catch (IllegalAccessException e) {
            throw new PersistenceException(e);
        }
    }

    private static void loopProperties(Iterable<Object> iter, List<ConnectorPropertyJPAEntity> propSet) {
        Iterator<Object> iterator = iter.iterator();

        while (iterator.hasNext()) {
            Object obj = iterator.next();
            ConnectorPropertyJPAEntity entity = ConnectorPropertyJPAEntity.getFromObject(obj);
            propSet.add(entity);
        }
    }

}