com.quinsoft.zeidon.standardoe.ApplicationImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.quinsoft.zeidon.standardoe.ApplicationImpl.java

Source

/**
This file is part of the Zeidon Java Object Engine (Zeidon JOE).
    
Zeidon JOE is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
    
Zeidon JOE is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.
    
You should have received a copy of the GNU Lesser General Public License
along with Zeidon JOE.  If not, see <http://www.gnu.org/licenses/>.
    
Copyright 2009-2015 QuinSoft
 */
/**
 *
 */
package com.quinsoft.zeidon.standardoe;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

import org.apache.commons.io.IOUtils;

import com.quinsoft.zeidon.Application;
import com.quinsoft.zeidon.Task;
import com.quinsoft.zeidon.TaskQualification;
import com.quinsoft.zeidon.UnknownLodDefException;
import com.quinsoft.zeidon.View;
import com.quinsoft.zeidon.ZeidonException;
import com.quinsoft.zeidon.domains.Domain;
import com.quinsoft.zeidon.objectdefinition.LodDef;
import com.quinsoft.zeidon.utils.PortableFileReader;
import com.quinsoft.zeidon.utils.PortableFileReader.PortableFileAttributeHandler;

/**
 * @author DG
 *
 */
class ApplicationImpl implements Application, PortableFileAttributeHandler {
    /**
     * List of attribute values loaded from zeidon.app.  They are stored in a hash
     * map to make it easier to load them.
     */
    private final Map<String, String> attributes = new LinkedHashMap<String, String>();
    private final Map<String, LodDef> lodDefList = new HashMap<String, LodDef>();
    private final String zeidonRootDir;
    private final ViewNameList viewNameList = new ViewNameList();
    private DomainList domainList;

    /**
     * Create an application and get the name from zeidon.app.
     *
     * @param zeidonRootDir
     */
    ApplicationImpl(String zeidonRootDir) {
        this.zeidonRootDir = zeidonRootDir;
    }

    @Override
    public String getName() {
        return attributes.get("APP_NAME");
    }

    @Override
    public String getObjectDir() {
        return attributes.get("APP_ADOBIN");
    }

    @Override
    public synchronized LodDef getLodDef(TaskQualification taskQual, String name) throws UnknownLodDefException {
        String lowerName = name.toLowerCase();
        if (lodDefList.containsKey(lowerName))
            return lodDefList.get(lowerName);

        LodDef lodDef = new LodDef(taskQual.getTask(), this, name);
        lodDefList.put(lowerName, lodDef);

        return lodDef;
    }

    @Override
    public void setAttribute(PortableFileReader reader) {
        String attName = reader.getAttributeName();

        // If the attr name begins with ZEIDON then it's part of the system app and we can
        // ignore those attributes.
        if (attName.startsWith("ZEIDON"))
            return;

        String value = reader.getAttributeValue();
        if (value.startsWith("."))
            value = zeidonRootDir + value.substring(1);

        attributes.put(attName, value);
    }

    @Override
    public void dropNameForView(String name, View view) {
        viewNameList.dropNameForView(name, view);
    }

    @Override
    public View getViewByName(String name) {
        return viewNameList.getViewByName(name);
    }

    @Override
    public void setNameForView(String name, View view) {
        // Move the view to be under the system task.  We do this because when
        // the view's current task is dropped this view will still hold on to
        // a reference to the task and it won't get cleaned up.
        if (view.getTask() != view.getTask().getSystemTask()) // Already system task?
        {
            ViewImpl v = ((InternalView) view).getViewImpl();
            v.reassignTask(view.getTask().getSystemTask());
        }

        viewNameList.setNameForView(name, view);
    }

    @Override
    public Collection<String> getAllViewNames(View view) {
        return viewNameList.getAllViewNames(view);
    }

    @Override
    public String toString() {
        return getName();
    }

    ViewNameList getViewNameList() {
        return viewNameList;
    }

    synchronized void loadDomains(Task task) {
        if (domainList != null)
            return; // Already loaded the domains.

        domainList = new DomainList(this);
        domainList.loadDomains(task);
    }

    @Override
    public Domain getDomain(String name) {
        return domainList.getDomain(name);
    }

    /* (non-Javadoc)
     * @see com.quinsoft.zeidon.Application#getPackage()
     */
    @Override
    public String getPackage() {
        return attributes.get("APP_PACKAGE");
    }

    /* (non-Javadoc)
     * @see com.quinsoft.zeidon.Application#nullStringEqualsEmptyString()
     */
    @Override
    public boolean nullStringEqualsEmptyString() {
        return true; //TODO: Shouldn't this be read from config?
    }

    /* (non-Javadoc)
     * @see com.quinsoft.zeidon.Application#getAllNamedViews()
     */
    @Override
    public Collection<? extends View> getAllNamedViews() {
        return getViewNameList().getAllNamedViews();
    }

    /* (non-Javadoc)
     * @see com.quinsoft.zeidon.Application#dropView(com.quinsoft.zeidon.View)
     */
    @Override
    public void dropView(View view) {
        getViewNameList().dropView(view);
    }

    @Override
    public boolean isSystemApp() {
        return false;
    }

    @Override
    public List<String> getLodNameList(Task task) {
        ClassLoader loader = this.getClass().getClassLoader();
        final String resourceDir = getObjectDir() + "/";

        Pattern pattern = Pattern.compile("(.*)(\\.xod$)", Pattern.CASE_INSENSITIVE);
        try {
            return (List<String>) IOUtils.readLines(loader.getResourceAsStream(resourceDir), StandardCharsets.UTF_8)
                    .stream().map(resourceName -> pattern.matcher(resourceName)) // Create a matcher
                    .filter(matcher -> matcher.matches()) // Keep only ones that match.
                    .map(matcher -> matcher.group(1)) // Get the base filename.
                    .collect(Collectors.toList());
        } catch (IOException e) {
            throw ZeidonException.wrapException(e).appendMessage("XOD resource dir: %s", resourceDir);
        }

    }
}