001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019 020package org.apache.isis.core.progmodel.facets.properties.event; 021 022import com.google.common.base.Objects; 023import com.google.common.collect.Lists; 024 025import org.apache.isis.applib.FatalException; 026import org.apache.isis.applib.Identifier; 027import org.apache.isis.applib.services.eventbus.EventBusService; 028import org.apache.isis.applib.services.eventbus.PropertyChangedEvent; 029import org.apache.isis.core.metamodel.adapter.ObjectAdapter; 030import org.apache.isis.core.metamodel.facetapi.Facet; 031import org.apache.isis.core.metamodel.facetapi.FacetHolder; 032import org.apache.isis.core.metamodel.facets.accessor.PropertyOrCollectionAccessorFacet; 033import org.apache.isis.core.metamodel.facets.properties.event.PostsPropertyChangedEventClearFacet; 034import org.apache.isis.core.metamodel.facets.properties.event.PostsPropertyChangedEventClearFacetAbstract; 035import org.apache.isis.core.metamodel.facets.properties.modify.PropertyClearFacet; 036import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector; 037 038public class PostsPropertyChangedEventClearFacetAnnotation 039 extends PostsPropertyChangedEventClearFacetAbstract { 040 041 private final PropertyOrCollectionAccessorFacet getterFacet; 042 private final PropertyClearFacet clearFacet; 043 private final Helper helper; 044 045 public PostsPropertyChangedEventClearFacetAnnotation( 046 final Class<? extends PropertyChangedEvent<?, ?>> eventType, 047 final PropertyOrCollectionAccessorFacet getterFacet, 048 final PropertyClearFacet clearFacet, 049 final ServicesInjector servicesInjector, 050 final FacetHolder holder) { 051 super(eventType, holder); 052 this.getterFacet = getterFacet; 053 this.clearFacet = clearFacet; 054 this.helper = new Helper(servicesInjector); 055 } 056 057 @Override 058 public void clearProperty(ObjectAdapter targetAdapter) { 059 if(clearFacet == null) { 060 return; 061 } 062 063 if(helper.getEventBusService() == null) { 064 clearFacet.clearProperty(targetAdapter); 065 return; 066 } 067 068 final Object oldValue = getterFacet.getProperty(targetAdapter); 069 clearFacet.clearProperty(targetAdapter); 070 final Object newValue = getterFacet.getProperty(targetAdapter); 071 072 postEventIfChanged(targetAdapter, getIdentified().getIdentifier(), oldValue, newValue); 073 } 074 075 076 @SuppressWarnings({ "rawtypes", "unchecked" }) 077 private void postEventIfChanged( 078 final ObjectAdapter targetAdapter, 079 final Identifier identifier, 080 final Object oldValue, 081 final Object newValue) { 082 083 if(Objects.equal(oldValue, newValue)) { 084 // do nothing. 085 return; 086 } 087 try { 088 final Class type = value(); 089 final Object source = ObjectAdapter.Util.unwrap(targetAdapter); 090 final PropertyChangedEvent<?, ?> event = Util.newEvent(type, source, identifier, oldValue, newValue); 091 092 helper.postEvent(event); 093 } catch (Exception e) { 094 throw new FatalException(e); 095 } 096 } 097 098 // ////////////////////////////////////// 099 // MultiTypedFacet 100 // ////////////////////////////////////// 101 102 @SuppressWarnings("unchecked") 103 @Override 104 public Class<? extends Facet>[] facetTypes() { 105 return Lists.newArrayList( 106 type(), 107 PostsPropertyChangedEventClearFacet.class 108 ).toArray(new Class[]{}); 109 } 110 111 @SuppressWarnings("unchecked") 112 @Override 113 public <T extends Facet> T getFacet(Class<T> facet) { 114 return (T) this; 115 } 116 117 118}