/* * Copyright 2008-2017 the original author or authors. * * Licensed 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.codehaus.griffon.runtime.core; import griffon.core.Configuration; import griffon.core.PlatformHandler; import griffon.exceptions.InstanceNotFoundException; import griffon.exceptions.TypeNotFoundException; import griffon.util.CollectionUtils; import griffon.util.GriffonApplicationUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Inject; import javax.inject.Provider; import java.util.Map; import static griffon.util.GriffonNameUtils.isBlank; /** * @author Andres Almiray * @since 2.0.0 */ public class PlatformHandlerProvider implements Provider<PlatformHandler> { private static final Logger LOG = LoggerFactory.getLogger(PlatformHandlerProvider.class); private static final String DEFAULT_PLATFORM_HANDLER = "org.codehaus.griffon.runtime.core.DefaultPlatformHandler"; private static final Map<String, String> DEFAULT_PLATFORM_HANDLERS = CollectionUtils.<String, String>map() .e("linux", DEFAULT_PLATFORM_HANDLER) .e("linux64", DEFAULT_PLATFORM_HANDLER) .e("macosx", "org.codehaus.griffon.runtime.core.DefaultMacOSXPlatformHandler") .e("macosx64", "org.codehaus.griffon.runtime.core.DefaultMacOSXPlatformHandler") .e("solaris", DEFAULT_PLATFORM_HANDLER) .e("windows", DEFAULT_PLATFORM_HANDLER) .e("windows64", DEFAULT_PLATFORM_HANDLER); @Inject private Configuration configuration; @Override @SuppressWarnings("unchecked") public PlatformHandler get() { String platform = GriffonApplicationUtils.platform; String handlerClassName = configuration.getAsString("platform.handler." + platform, DEFAULT_PLATFORM_HANDLERS.get(platform)); if (isBlank(handlerClassName)) { handlerClassName = DEFAULT_PLATFORM_HANDLER; } if (LOG.isDebugEnabled()) { LOG.debug("Using " + handlerClassName + " as PlatformHandler"); } Class<PlatformHandler> handlerClass; try { handlerClass = (Class<PlatformHandler>) Class.forName(handlerClassName, true, getClass().getClassLoader()); } catch (ClassNotFoundException e) { throw new TypeNotFoundException(PlatformHandler.class.getName(), e); } catch (NoClassDefFoundError e) { // could be caused by a missing class in the classpath (such as com.apple.mrj.MRJAboutHandler) // use a dummy handler if and only if +JDK9 if (GriffonApplicationUtils.isJdk9()) { return new DefaultPlatformHandler(); } throw new TypeNotFoundException(PlatformHandler.class.getName(), e); } try { return handlerClass.newInstance(); } catch (IllegalAccessException | InstantiationException e) { throw new InstanceNotFoundException(handlerClass, e); } } }