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