001 package org.shiftone.jrat.inject;
002
003
004 import org.shiftone.jrat.core.JRatException;
005 import org.shiftone.jrat.core.ServiceFactory;
006 import org.shiftone.jrat.core.criteria.MethodCriteria;
007 import org.shiftone.jrat.inject.bytecode.Transformer;
008 import org.shiftone.jrat.inject.process.CompositeFileProcessor;
009 import org.shiftone.jrat.inject.process.FileProcessor;
010 import org.shiftone.jrat.util.Assert;
011 import org.shiftone.jrat.util.io.IOUtil;
012 import org.shiftone.jrat.util.log.Logger;
013
014 import java.io.File;
015
016
017 /**
018 * @author jeff@shiftone.org (Jeff Drost)
019 */
020 public class Injector {
021
022 private static final Logger LOG = Logger.getLogger(Injector.class);
023 public static final String WORK_FILE_END = "-JRatWorkFile";
024 private FileProcessor fileProcessor = new CompositeFileProcessor();
025 private InjectorOptions options = new InjectorOptions();
026 private ServiceFactory serviceFactory = ServiceFactory.getInstance();
027 private Transformer transformer = serviceFactory.getTransformer();
028
029 public void inject(File sourceFile, File targetFile) throws InjectionException {
030
031 String sourceExt = IOUtil.getExtention(sourceFile);
032 String targetExt = IOUtil.getExtention(targetFile);
033 File targetDir = targetFile.getParentFile();
034
035 Assert.assertSame("file extentions", sourceExt, targetExt);
036
037 // thanks Ilja Pavkovic for finding this bug
038 if (targetDir != null) {
039
040 // if the parent directory doesn't exist, then it must be created
041 // first.
042 if (!targetDir.exists() && !targetDir.mkdirs()) {
043 throw new InjectionException("error creating parent directory of target file : " + targetDir);
044 }
045 }
046
047 fileProcessor.process(transformer, options, sourceFile, targetFile);
048 }
049
050
051 public void inject(String source, String target) throws InjectionException {
052 inject(new File(source), new File(target));
053 }
054
055
056 public void inject(File file) throws InjectionException {
057
058 if (file.getName().endsWith(Injector.WORK_FILE_END)) {
059 try {
060 IOUtil.delete(file);
061 }
062 catch (JRatException e) {
063 LOG.warn("unable to delete : " + file);
064 }
065 } else {
066 inject(file, file);
067 }
068 }
069
070
071 public void inject(String fileName) throws InjectionException {
072 inject(new File(fileName));
073 }
074
075
076 // ------------------------------------------------------------------------------
077 public MethodCriteria getMethodCriteria() {
078 return options.getCriteria();
079 }
080
081
082 public void setMethodCriteria(MethodCriteria criteria) {
083 options.setCriteria(criteria);
084 }
085 }