/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF 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.apache.sling.cms.transformer.internal;

import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.PersistenceException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventConstants;
import org.osgi.service.event.EventHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(service = EventHandler.class, property = {
        EventConstants.EVENT_TOPIC + "=org/apache/sling/api/resource/Resource/CHANGED",
        EventConstants.EVENT_FILTER + "=(&(resourceType=sling:FileContent))" })
public class RenditionCleaner implements EventHandler {

    private static final Logger log = LoggerFactory.getLogger(RenditionCleaner.class);

    @Reference
    private TransformationServiceUser transformationServiceUser;

    @Override
    public void handleEvent(Event event) {
        try (ResourceResolver resolver = transformationServiceUser.getTransformationServiceUser()) {
            Resource renditions = resolver.getResource(event.getProperty("path") + "/renditions");
            if (renditions != null) {
                resolver.delete(renditions);
                resolver.commit();
            }
        } catch (LoginException | PersistenceException e) {
            log.warn("Failed to remove renditions", e);
        }
    }

}
