/* * Copyright 2001-2008 Geert Bevin <gbevin[remove] at uwyn dot com> * Licensed under the Apache License, Version 2.0 (the "License") * $Id: BeanLoaderGroovy.java 3953 2008-05-08 01:04:08Z gbevin $ */ package com.uwyn.rife.crud.beanloaders; import com.uwyn.rife.crud.exceptions.BeanImplementationInstantiationException; import com.uwyn.rife.crud.exceptions.BeanImplementationNotFoundException; import com.uwyn.rife.resources.ResourceFinder; import com.uwyn.rife.tools.exceptions.InnerClassException; import com.uwyn.rife.tools.InputStreamUser; import groovy.lang.GroovyClassLoader; import java.io.InputStream; import java.net.URL; import java.util.HashMap; import java.util.Map; public class BeanLoaderGroovy { private ResourceFinder mResourceFinder = null; private Map<String, Long> mScriptsModification = new HashMap<String, Long>(); private GroovyClassLoader mGroovyClassloader = null; public BeanLoaderGroovy(ResourceFinder resourceFinder) { mResourceFinder = resourceFinder; } public synchronized Class getClassInstance(final String implementation) throws ClassNotFoundException { ClassLoader parent = getClass().getClassLoader(); try { if (null == mGroovyClassloader) { mGroovyClassloader = new GroovyClassLoader(parent); } URL resource = mResourceFinder.getResource(implementation); long current_modification = -1; if (resource != null) { current_modification = mResourceFinder.getModificationTime(implementation); } if (null == resource) { throw new BeanImplementationNotFoundException(implementation, null); } Long previous_modification = mScriptsModification.get(implementation); if (previous_modification != null && previous_modification != current_modification) { mGroovyClassloader = new GroovyClassLoader(parent); } Class groovy_class = null; try { groovy_class = mResourceFinder.useStream(resource, new InputStreamUser() { public Class useInputStream(InputStream stream) throws InnerClassException { try { return mGroovyClassloader.parseClass(stream, implementation); } catch (Throwable e) { throwException(new BeanImplementationInstantiationException(implementation, e)); } return null; } }); } catch (InnerClassException e) { throw (ClassNotFoundException)e.getCause(); } if (null == previous_modification || previous_modification != current_modification) { mScriptsModification.put(implementation, current_modification); } return groovy_class; } catch (Throwable e) { throw new BeanImplementationInstantiationException(implementation, e); } } }