Package org.apache.axiom.attachments.lifecycle.impl

Source Code of org.apache.axiom.attachments.lifecycle.impl.DataHandlerExtImpl

/*
* 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.axiom.attachments.lifecycle.impl;

import java.io.File;
import java.io.IOException;
import java.util.Observable;
import java.util.Observer;

import javax.activation.DataHandler;
import javax.activation.DataSource;

import org.apache.axiom.attachments.CachedFileDataSource;
import org.apache.axiom.attachments.lifecycle.DataHandlerExt;
import org.apache.axiom.attachments.lifecycle.LifecycleManager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class DataHandlerExtImpl extends DataHandler implements
    DataHandlerExt, Observer {

  private static final Log log = LogFactory.getLog(DataHandlerExtImpl.class);
  private DataHandler dataHandler = null;
  private LifecycleManager manager = null;
  private static int READ_COUNT = 1;
  private boolean deleteOnreadOnce = false;
  public DataHandlerExtImpl(DataHandler dataHandler, LifecycleManager manager){   
    super(dataHandler.getDataSource());
    this.dataHandler = dataHandler;
    this.manager = manager;
  }

  public void deleteWhenReadOnce() throws IOException {
    deleteOnreadOnce = true;
    FileAccessor fa =manager.getFileAccessor(getName());
    if(fa==null){
      log.warn("Could not find FileAccessor, delete on readOnce Failed");       
      return;
    }
    if(fa.getAccessCount() >= READ_COUNT){
      purgeDataSource();
    }else{
      fa.addObserver(this);
    }     
  }

  public void purgeDataSource() throws IOException {
    if(log.isDebugEnabled()){
      log.debug("Start purgeDataSource");
    }
    File file = getFile();   
    if(file!=null){
      //Invoke delete from LifecycleManager
      manager.delete(file);
      //If file was registered with VMShutdown hook
      //lets remove it from the list to be deleted on VMExit.
      VMShutdownHook hook =VMShutdownHook.hook();
      if(hook.isRegistered()){
        hook.remove(file);
      }
      if(log.isDebugEnabled()){
        log.debug("File Purged and removed from Shutdown Hook Collection");
      }
    }else{
      if(log.isDebugEnabled()){
        log.debug("DataSource is not a CachedFileDataSource, Unable to Purge.");
      }
    }
   
    if(log.isDebugEnabled()){
      log.debug("End purgeDataSource");
    }
  }
 
  public void update(Observable o, Object arg) {
    try{
      if(log.isDebugEnabled()){
        log.debug("Start update in Observer");
      }
      if(o instanceof FileAccessor){
        FileAccessor fa = (FileAccessor)o;
        if(deleteOnreadOnce && fa.getAccessCount()>=READ_COUNT){
          purgeDataSource();
        }
      }           
    }catch(IOException e){
      if(log.isDebugEnabled()){
        log.debug("delete on readOnce Failed");
      }
      log.warn("delete on readOnce Failed with IOException in Observer"+e.getMessage());
    }
    if(log.isDebugEnabled()){
      log.debug("End update in Observer");
    }
  }

  private File getFile(){
    //get DataSource from DataHandler
    DataSource dataSource = dataHandler.getDataSource();
    if(dataSource instanceof CachedFileDataSource){
      CachedFileDataSource cds = (CachedFileDataSource)dataSource;
      //get the file object from data source.
      return cds.getFile();
    }
    return null;
 
}
TOP

Related Classes of org.apache.axiom.attachments.lifecycle.impl.DataHandlerExtImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.