/* * Copyright 2011 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. */ /** * This package contains all the crux's client engine. */ package org.cruxframework.crux.core.client; import java.util.logging.Level; import java.util.logging.Logger; import org.cruxframework.crux.core.client.config.CruxClientConfig; import org.cruxframework.crux.core.client.errors.ErrorHandler; import org.cruxframework.crux.core.client.errors.ValidationErrorHandler; import org.cruxframework.crux.core.client.utils.StringUtils; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.GWT.UncaughtExceptionHandler; import com.google.gwt.dom.client.Element; import com.google.gwt.logging.client.LogConfiguration; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Timer; /** * CRUX Client Engine. It starts a ScreenFactory to build the client view. * Any module of a Crux application must inherit Crux module. * <p> * The following example shows a HelloWorld module using Crux: * <pre> * {@code <module rename-to='helloworld'>} * {@code <inherits name='org.cruxframework.crux.core.Crux'/>} * {@code <inherits name='org.cruxframework.crux.gwt.CruxGWTWidgets'/>} * ... * {@code </module>} * </pre> * * * @author Thiago da Rosa de Bustamante */ public class Crux implements EntryPoint { private static Logger logger = Logger.getLogger(Crux.class.getName()); private static CruxClientConfig config; private static ErrorHandler errorHandler; private static boolean initialized = false; private static ClientMessages messages; private static ValidationErrorHandler validationErrorHandler; /** * * @return */ public static CruxClientConfig getConfig() { return config; } /** * * @return */ public static ErrorHandler getErrorHandler() { return errorHandler; } /** * * @return */ public static ClientMessages getMessages() { return messages; } /** * @return */ public static boolean isInitialized() { return initialized; } /** * * @return */ public static ValidationErrorHandler getValidationErrorHandler() { return validationErrorHandler; } /** * */ public static void initializeEngine() { initializeEngine(null, null); } public static void initializeEngine(String screenName, String rootViewElementID) { try { if (initialized) { Crux.getErrorHandler().handleError(new IllegalStateException(messages.cruxAlreadyInitializedError())); } else { if (LogConfiguration.loggingIsEnabled()) { logger.log(Level.INFO, "Initializing Crux engine..."); } messages = GWT.create(ClientMessages.class); config = GWT.create(CruxClientConfig.class); errorHandler = GWT.create(ErrorHandler.class); validationErrorHandler = GWT.create(ValidationErrorHandler.class); // define a default handler for uncaught exception GWT.setUncaughtExceptionHandler(new UncaughtExceptionHandler() { @Override public void onUncaughtException(Throwable e) { errorHandler.handleError(e); } }); org.cruxframework.crux.core.client.screen.ScreenFactory.getInstance().getScreen(screenName, rootViewElementID); initialized = true; if (LogConfiguration.loggingIsEnabled()) { logger.log(Level.INFO, "Crux engine loaded."); } } } catch (Throwable e) { if (Crux.errorHandler != null) { Crux.getErrorHandler().handleError(e); } } stopLoadingProgressBar(); } /** * * @param errorHandler */ public static void setErrorHandler(ErrorHandler errorHandler) { if (errorHandler == null) { Crux.errorHandler = GWT.create(ErrorHandler.class); } else { Crux.errorHandler = errorHandler; } } /** * * @param validationErrorHandler */ public static void setValidationErrorHandler(ValidationErrorHandler validationErrorHandler) { if (validationErrorHandler == null) { Crux.validationErrorHandler = GWT.create(ValidationErrorHandler.class); } else { Crux.validationErrorHandler = validationErrorHandler; } } /** * */ private static void stopLoadingProgressBar() { final Element loadElement = DOM.getElementById("cruxSplashScreen"); if (loadElement != null) { String transactionDelay = loadElement.getAttribute("transactionDelay"); int delay = 1; if (!StringUtils.isEmpty(transactionDelay)) { delay = Integer.parseInt(transactionDelay); } final Element parent = loadElement.getParentElement(); if (parent != null) { new Timer() { @Override public void run() { parent.removeChild(loadElement); } }.schedule(delay); } } } /** * This is the entry point method. Called when the page is loaded. */ public void onModuleLoad() { initializeEngine(); } }