001    /*
002      GRANITE DATA SERVICES
003      Copyright (C) 2011 GRANITE DATA SERVICES S.A.S.
004    
005      This file is part of Granite Data Services.
006    
007      Granite Data Services is free software; you can redistribute it and/or modify
008      it under the terms of the GNU Library General Public License as published by
009      the Free Software Foundation; either version 2 of the License, or (at your
010      option) any later version.
011    
012      Granite Data Services is distributed in the hope that it will be useful, but
013      WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
014      FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
015      for more details.
016    
017      You should have received a copy of the GNU Library General Public License
018      along with this library; if not, see <http://www.gnu.org/licenses/>.
019    */
020    
021    package org.granite.scan;
022    
023    import java.io.InputStream;
024    import java.util.Properties;
025    
026    import org.granite.logging.Logger;
027    
028    /**
029     * @author Franck WOLFF
030     */
031    public class ScannerFactory {
032            
033            private static final Logger log = Logger.getLogger(ScannerFactory.class);
034    
035            
036            public static Scanner createScanner(ScannedItemHandler handler, String marker) {
037            if (isVFSAvailable() && !isEmbedded() && isJBoss(5)) {
038                    log.debug("Using VFS aware scanner");
039                    try {
040                            Class<?> vfsScannerClass = ScannerFactory.class.getClassLoader().loadClass("org.granite.scan.VFSScanner");
041                            return (Scanner)vfsScannerClass.getConstructor(ScannedItemHandler.class, String.class).newInstance(handler, marker);                    
042                    }
043                    catch (Exception e) {
044                            throw new RuntimeException("Could not create VFSScanner", e);
045                    }
046            }
047            if (isVFS3Available() && !isEmbedded() && isJBoss(6)) {
048                    log.debug("Using VFS3 aware scanner");
049                    try {
050                            Class<?> vfsScannerClass = ScannerFactory.class.getClassLoader().loadClass("org.granite.scan.VFS3Scanner");
051                            return (Scanner)vfsScannerClass.getConstructor(ScannedItemHandler.class, String.class).newInstance(handler, marker);                    
052                    }
053                    catch (Exception e) {
054                            throw new RuntimeException("Could not create VFS3Scanner", e);
055                    }
056            }
057            
058            log.debug("Using default Scanner");
059            return new URLScanner(handler, marker);
060            }
061       
062            private static boolean isVFSAvailable() {
063                    try {
064                            Class.forName("org.jboss.virtual.VFS");
065                            log.trace("VFS detected");
066                            return true;
067                    }
068                    catch (Throwable t) {
069                            return false;
070                    }
071            }
072               
073            private static boolean isVFS3Available() {
074                    try {
075                            Class.forName("org.jboss.vfs.VFS");
076                            log.trace("VFS3 detected");
077                            return true;
078                    }
079                    catch (Throwable t) {
080                            return false;
081                    }
082            }
083            
084            private static boolean isJBoss(int version) {
085                    try {
086                            Properties props = new Properties();
087                            InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("/org/jboss/version.properties");
088                            if (is == null)
089                                    is = Thread.currentThread().getContextClassLoader().getResourceAsStream("org/jboss/version.properties");
090                            if (is != null) {
091                                    // JBoss AS 4, 5, 6
092                                    props.load(is);
093                                    is.close();
094                                    int major = Integer.parseInt(props.getProperty("version.major"));
095                                    int minor = Integer.parseInt(props.getProperty("version.minor"));
096                                    
097                                    boolean isJBossVersion = major >= version && minor >= 0;
098                                    if (isJBossVersion)
099                                            log.trace("JBoss " + major + "." + minor + " detected");
100                                    
101                                    return isJBossVersion;
102                            }
103                            
104                            // JBoss AS 7 ?
105                            log.trace("JBoss AS 7+ detected");
106                            
107                            return true;
108                    }
109                    catch (Throwable t) {
110                            return false;
111                    }
112            }
113            
114            private static boolean isEmbedded() {
115                    try {
116                            Class.forName("org.jboss.embedded.Bootstrap");
117                            log.trace("JBoss Embedded detected");
118                            return true;
119                    }
120                    catch (Throwable t) {
121                            return false;
122                    }
123            }
124    }