package io.cattle.platform.object.util; import io.cattle.platform.eventing.EventService; import io.cattle.platform.eventing.model.Event; import io.cattle.platform.eventing.model.EventVO; import io.cattle.platform.framework.event.FrameworkEvents; import io.cattle.platform.object.ObjectManager; import io.cattle.platform.object.meta.ObjectMetaDataManager; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.PropertyUtils; public class ObjectUtils { public static void copy(Object src, Object dest) { try { BeanUtils.copyProperties(dest, src); } catch (IllegalAccessException e) { throw new IllegalArgumentException("Failed to copy properties from [" + src + "] to [" + dest + "]", e); } catch (InvocationTargetException e) { throw new IllegalArgumentException("Failed to copy properties from [" + src + "] to [" + dest + "]", e); } } public static Object getAccountId(Object obj) { return getPropertyIgnoreErrors(obj, ObjectMetaDataManager.ACCOUNT_FIELD); } public static boolean isSystem(Object obj) { return Boolean.TRUE.equals(getPropertyIgnoreErrors(obj, ObjectMetaDataManager.SYSTEM_FIELD)); } public static Object getId(Object obj) { return getPropertyIgnoreErrors(obj, ObjectMetaDataManager.ID_FIELD); } public static String getState(Object obj) { Object result = getPropertyIgnoreErrors(obj, ObjectMetaDataManager.STATE_FIELD); return result == null ? null : result.toString(); } public static Date getRemoved(Object obj) { Object result = getPropertyIgnoreErrors(obj, ObjectMetaDataManager.REMOVED_FIELD); return result instanceof Date ? (Date) result : null; } public static Date getRemoveTime(Object obj) { Object result = getPropertyIgnoreErrors(obj, ObjectMetaDataManager.REMOVE_TIME_FIELD); return result instanceof Date ? (Date) result : null; } public static String getKind(Object obj) { Object kind = getPropertyIgnoreErrors(obj, ObjectMetaDataManager.KIND_FIELD); return kind == null ? null : kind.toString(); } public static boolean hasWritableProperty(Object obj, String name) { if (obj == null) { return false; } try { PropertyDescriptor desc = PropertyUtils.getPropertyDescriptor(obj, name); return desc == null ? false : desc.getWriteMethod() != null; } catch (IllegalAccessException e) { return false; } catch (InvocationTargetException e) { return false; } catch (NoSuchMethodException e) { return false; } } public static Object getPropertyIgnoreErrors(Object obj, String property) { try { if (obj == null) { return null; } return PropertyUtils.getProperty(obj, property); } catch (IllegalAccessException e) { } catch (InvocationTargetException e) { } catch (NoSuchMethodException e) { } return null; } public static Object getProperty(Object obj, String property) { try { if (obj == null) { return null; } return PropertyUtils.getProperty(obj, property); } catch (IllegalAccessException e) { throw new IllegalArgumentException("Failed to get property [" + property + "] on [" + obj + "]", e); } catch (InvocationTargetException e) { throw new IllegalArgumentException("Failed to get property [" + property + "] on [" + obj + "]", e); } catch (NoSuchMethodException e) { throw new IllegalArgumentException("Failed to get property [" + property + "] on [" + obj + "]", e); } } public static void setProperty(Object obj, String property, Object value) { try { if (obj == null) { return; } PropertyUtils.setProperty(obj, property, value); } catch (IllegalAccessException e) { throw new IllegalArgumentException("Failed to set property [" + property + "] on [" + obj + "] with value [" + value + "]", e); } catch (InvocationTargetException e) { throw new IllegalArgumentException("Failed to set property [" + property + "] on [" + obj + "] with value [" + value + "]", e); } catch (NoSuchMethodException e) { throw new IllegalArgumentException("Failed to set property [" + property + "] on [" + obj + "] with value [" + value + "]", e); } } public static void setPropertyIgnoreErrors(Object obj, String property, Object value) { try { if (obj == null) { return; } PropertyUtils.setProperty(obj, property, value); } catch (IllegalAccessException e) { } catch (InvocationTargetException e) { } catch (NoSuchMethodException e) { } } public static ObjectToStringWrapper toStringWrapper(Object obj) { return new ObjectToStringWrapper(obj); } public static Object getValue(Object obj, String name) { Object val = getPropertyIgnoreErrors(obj, name); if (val == null) { val = DataAccessor.field(obj, name, Object.class); } return val; } private static final class ObjectToStringWrapper { Object obj; public ObjectToStringWrapper(Object obj) { super(); this.obj = obj; } @Override public String toString() { if (obj == null) { return "null"; } return String.format("%s:%s", obj.getClass().getSimpleName(), ObjectUtils.getId(obj)); } } public static String toString(Object obj) { if (obj == null) { return null; } return obj.toString(); } public static void publishChanged(EventService eventService, ObjectManager objectManager, Object obj) { Object accountId = getAccountId(obj); Object resourceId = getId(obj); String type = objectManager.getType(obj); publishChanged(eventService, accountId, resourceId, type); } public static void publishChanged(final EventService eventService, Object accountId, Object resourceId, String resourceType) { Map<String, Object> data = new HashMap<>(); data.put(ObjectMetaDataManager.ACCOUNT_FIELD, accountId); final Event event = EventVO.newEvent(FrameworkEvents.STATE_CHANGE) .withData(data) .withResourceType(resourceType) .withResourceId(toString(resourceId)); eventService.publish(event); } }