org.jtheque.core.impl.CoreImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.jtheque.core.impl.CoreImpl.java

Source

package org.jtheque.core.impl;

/*
 * Copyright JTheque (Baptiste Wicht)
 *
 * 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.
 */

/*
 * Copyright JTheque (Baptiste Wicht)
 *
 * 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.
 */

import org.jtheque.core.ApplicationListener;
import org.jtheque.core.Core;
import org.jtheque.core.CoreConfiguration;
import org.jtheque.core.application.Application;
import org.jtheque.images.ImageService;
import org.jtheque.states.StateService;
import org.jtheque.utils.StringUtils;
import org.jtheque.utils.annotations.GuardedInternally;
import org.jtheque.utils.bean.Version;
import org.jtheque.utils.collections.CollectionUtils;
import org.jtheque.utils.collections.WeakEventListenerList;

import org.springframework.core.io.FileSystemResource;

import java.io.File;
import java.util.Collection;

/**
 * The core implementation.
 *
 * @author Baptiste Wicht
 */
public final class CoreImpl implements Core {
    private static final String CORE_MESSAGES_FILE = "http://jtheque.baptiste-wicht.com/files/messages/jtheque-core-messages.xml";

    @GuardedInternally
    private final WeakEventListenerList<ApplicationListener> listeners = WeakEventListenerList.create();

    @GuardedInternally
    private final Collection<String> creditsMessage = CollectionUtils.newConcurrentList();

    @GuardedInternally
    //Because cannot be modified
    private Collection<String> languages;

    @GuardedInternally
    private final CoreConfiguration configuration;

    private final ImageService imageService;

    private volatile Application application;

    /**
     * Construct a new Core.
     *
     * @param stateService The state service.
     * @param imageService The resource service.
     */
    public CoreImpl(StateService stateService, ImageService imageService) {
        super();

        this.imageService = imageService;

        configuration = stateService.getState(new CoreConfigurationImpl());

        creditsMessage.add("about.view.copyright");
    }

    @Override
    public void launchApplication(Application application) {
        if (this.application != null) {
            throw new IllegalStateException("The application is already launched");
        }

        this.application = application;

        Collection<String> languagesLong = CollectionUtils.newList(3);

        for (String supportedLanguage : application.getSupportedLanguages()) {
            if ("fr".equals(supportedLanguage)) {
                languagesLong.add("Franais");
            } else if ("en".equals(supportedLanguage)) {
                languagesLong.add("English");
            } else if ("de".equals(supportedLanguage)) {
                languagesLong.add("Deutsch");
            }
        }

        languages = CollectionUtils.protect(languagesLong);

        fireApplicationLaunched(application);

        imageService.registerResource(WINDOW_ICON, new FileSystemResource(new File(application.getWindowIcon())));
    }

    @Override
    public void addApplicationListener(ApplicationListener listener) {
        listeners.add(listener);
    }

    @Override
    public void removeApplicationListener(ApplicationListener listener) {
        listeners.remove(listener);
    }

    /**
     * Fire an application launched event.
     *
     * @param application The new application.
     */
    private void fireApplicationLaunched(Application application) {
        for (ApplicationListener applicationListener : listeners) {
            applicationListener.applicationLaunched(application);
        }
    }

    @Override
    public String getCoreMessageFileURL() {
        return CORE_MESSAGES_FILE;
    }

    @Override
    public void addCreditsMessage(String key) {
        creditsMessage.add(key);
    }

    @Override
    public Collection<String> getCreditsMessage() {
        return CollectionUtils.protect(creditsMessage);
    }

    @Override
    public boolean isNotCompatibleWith(Version version) {
        //Compatible with 2.1.0 and greater
        return !(version.equals(VERSION) || version.isGreaterThan(VERSION));
    }

    @Override
    public Application getApplication() {
        return application;
    }

    @Override
    public CoreConfiguration getConfiguration() {
        return configuration;
    }

    @Override
    public Collection<String> getPossibleLanguages() {
        if (languages == null) {
            throw new IllegalStateException("The application has not been launched");
        }

        return languages;
    }

    @Override
    public String getImprovementURL() {
        return getURL("url.improvement", BUG_TRACKER_URL);
    }

    @Override
    public String getBugTrackerURL() {
        return getURL("url.bugs", BUG_TRACKER_URL);
    }

    @Override
    public String getHelpURL() {
        return getURL("url.help", HELP_URL);
    }

    /**
     * Return the URL with the specified property. If the application doesn't provide this property, this method return
     * the default value of the core.
     *
     * @param property   The property to get the URL from the application.
     * @param defaultURL The default URL of the core.
     *
     * @return The URL of the application if provided else the default URL of the core.
     */
    private String getURL(String property, String defaultURL) {
        String applicationURL = application.getProperty(property);

        return StringUtils.isNotEmpty(applicationURL) ? applicationURL : defaultURL;
    }
}