/*
* Copyright 2015 cruxframework.org.
*
* 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.cruxframework.crux.core.rebind.screen.widget;
import java.util.Iterator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.google.gwt.user.client.ui.IsWidget;
/**
* Builds a map of all widget libraries
* @author Thiago da Rosa de Bustamante
*/
public class WidgetLibraries
{
private static boolean initialized = false;
private static WidgetLibraries instance = new WidgetLibraries();
private static final Log logger = LogFactory.getLog(WidgetLibraries.class);
private ScanningStrategy strategy;
public WidgetLibraries()
{
strategy = new MapStrategy();
}
/**
*
* @param id
* @return
*/
public String getFactoryClass(String id)
{
initialize();
return strategy.getFactoryClass(id);
}
/**
*
* @param library
* @param id
* @return
*/
public String getFactoryClass(String library, String id)
{
initialize();
return strategy.getFactoryClass(library+"_"+id);
}
public String getWidgetType(Class<? extends IsWidget> widgetClass)
{
initialize();
return strategy.getWidgetType(widgetClass);
}
/**
*
* @return
*/
public Iterator<String> iterateRegisteredLibraries()
{
initialize();
return strategy.iterateRegisteredLibraries();
}
/**
*
* @param library
* @return
*/
public Iterator<String> iterateRegisteredLibraryWidgetCreators(String library)
{
initialize();
return strategy.iterateRegisteredLibraryWidgetCreators(library);
}
void initialize()
{
if (!initialized)
{
if (!strategy.initialize())
{
if (strategy instanceof MapStrategy)
{
logger.info("Widget Libraries map not found. Run the widgetLibrariesImporter tool to avoid runtime scanning. Using runtime strategy for scan libraries...");
strategy = new RuntimeStrategy();
strategy.initialize();
}
else
{
logger.error("Error initializing Widget Libraries.");
}
}
initialized = true;
}
}
public static WidgetLibraries getInstance()
{
return instance;
}
/**
* This class uses a file generated during application compilation to find out rest service classes.
*
* @author Thiago da Rosa de Bustamante
*
*/
private static class MapStrategy implements ScanningStrategy
{
public String getFactoryClass(String id)
{
return WidgetLibraryMap.getInstance().getFactoryClass(id);
}
@Override
public String getWidgetType(Class<? extends IsWidget> widgetClass)
{
return WidgetLibraryMap.getInstance().getWidgetType(widgetClass);
}
public boolean initialize()
{
return WidgetLibraryMap.getInstance().initialize();
}
@Override
public Iterator<String> iterateRegisteredLibraries()
{
return WidgetLibraryMap.getInstance().getRegisteredLibraries().iterator();
}
@Override
public Iterator<String> iterateRegisteredLibraryWidgetCreators(String library)
{
return WidgetLibraryMap.getInstance().getRegisteredLibraryFactories(library).iterator();
}
}
/**
* This class scan the application classpath to build a map of
* widget creators.
*
* @author Thiago da Rosa de Bustamante
*/
private static class RuntimeStrategy implements ScanningStrategy
{
public String getFactoryClass(String id)
{
return WidgetScanner.getFactoryClass(id);
}
@Override
public String getWidgetType(Class<? extends IsWidget> widgetClass)
{
return WidgetScanner.getWidgetType(widgetClass);
}
public boolean initialize()
{
try
{
WidgetScanner.initialize();
return true;
}
catch (Exception e)
{
logger.error("Error initializing widget scanner.", e);
return false;
}
}
@Override
public Iterator<String> iterateRegisteredLibraries()
{
return WidgetScanner.getRegisteredLibraries().iterator();
}
@Override
public Iterator<String> iterateRegisteredLibraryWidgetCreators(String library)
{
return WidgetScanner.getRegisteredLibraryFactories(library).iterator();
}
}
/**
* Describes a strategy for widgets scanning.
* @author Thiago da Rosa de Bustamante
*/
private static interface ScanningStrategy
{
String getFactoryClass(String id);
String getWidgetType(Class<? extends IsWidget> widgetClass);
boolean initialize();
Iterator<String> iterateRegisteredLibraries();
Iterator<String> iterateRegisteredLibraryWidgetCreators(String library);
}
}