/*
* Copyright (C) 2011-2014 GeoForge Project
*
* This program 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.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.geoforge.appogcecl.actioncontroller;
import java.io.File;
import java.util.Collection;
import java.util.HashSet;
import java.util.logging.Logger;
import org.geoforge.basusrspcdat.io.GfrPrpNamingBasGrpChl;
import org.geoforge.basusrspcdat.table.GfrBasTblGrpProjects;
import org.geoforge.basusrspcdsp.io.GfrPrpNamingBasDspUsr;
import org.geoforge.basusrspcdsp.table.GfrBasTblUsrSpcPrtHistoryAbs;
import org.geoforge.basusrspcdsp.table.GfrBasTblUsrSpcPrtHistoryWork;
import org.geoforge.guillc.GfrAppSpcAbs;
import org.geoforge.guillc.action.ActionPluginSetLicense;
import org.geoforge.guillc.actioncontroller.GfrAcrSpcAppMainAbs;
import org.geoforge.guillc.actionmanager.GfrAmrAppMainAbs;
import org.geoforge.guillc.optionpane.GfrOptionPaneAbs;
import org.geoforge.java.util.logging.filehandler.FileHandlerLogger;
import org.geoforge.java.lang.string.GfrUtlString;
import org.geoforge.mgrplg.handler.IGfrHandlerLicensingPlugin;
import org.geoforge.mgrplg.handler.IGfrHandlerPlugin;
import org.geoforge.mgrplg.impl.GfrPlgImplAbs;
import org.geoforge.mgrplg.model.GfrMdlPlg;
import org.geoforge.wrpbasspcdatogcecl.root.GfrWrpBasDatSpcRoot;
import org.geoforge.wrpbasusr.GfrValueDateHistory;
import org.geoforge.wrpbasusr.GfrWrpUsrSpcDspPrtAppRoot;
import org.geoforge.wrpbasusr.GfrWrpUsrSpcDspPrtAppWork;
import org.geoforge.wrpsql.GfrWrpSqlGetTableRecordingsTarget;
import org.geoforge.wrpsql.GfrWrpSqlRemoveRecordingKeyValue;
/**
*
* @author bantchao
*
* email: bantchao_AT_gmail.com ... please remove "_AT_" from the above string
* to get the right email address
*
*/
abstract public class GfrAcrSpcAppMainOgcAbs extends GfrAcrSpcAppMainAbs
{
// ----
// begin: instantiate logger for this class
final private static Logger _LOGGER_ = Logger.getLogger(GfrAcrSpcAppMainOgcAbs.class.getName());
static
{
GfrAcrSpcAppMainOgcAbs._LOGGER_.addHandler(FileHandlerLogger.s_getInstance());
}
// end: instantiate logger for this class
// ----
protected GfrAcrSpcAppPrtRootOgcEclAbs _acrActive = null;
abstract public void managePluginsHandler();
abstract public void addPluginHandler();
abstract public void deletePluginHandler();
abstract public void deletePluginsHandler();
abstract public void aboutPluginHandler();
// at launching time
abstract protected void _activateLicensedPluginsAtLaunchTime();
protected GfrAcrSpcAppMainOgcAbs(GfrAppSpcAbs app, GfrAmrAppMainAbs amr) throws Exception
{
super(app, amr);
}
protected void _activateLicensedPluginsAtLaunchTime(Collection<IGfrHandlerPlugin> colPlg)
{
if (colPlg==null || colPlg.isEmpty())
return;
// ---
for (IGfrHandlerPlugin plgCur: colPlg)
{
if (! (plgCur instanceof IGfrHandlerLicensingPlugin))
continue;
try
{
String strNamePlgCur = plgCur.getNamePlugin();
String strVersionPlgCur = plgCur.getVersionThisPlugin();
String strPathAbsLicPlgCur = GfrWrpUsrSpcDspPrtAppRoot.getInstance().getPathAbsoluteLicPlugin(strNamePlgCur, strVersionPlgCur);
if (strPathAbsLicPlgCur==null || strPathAbsLicPlgCur.length()<1)
continue;
IGfrHandlerLicensingPlugin hndPlgLic = (IGfrHandlerLicensingPlugin) plgCur;
if (! hndPlgLic.doJobStoredFileLicensePlugin(strPathAbsLicPlgCur))
{
String strWarning = "! hndPlgLic.doJobStoredFileLicensePlugin(strPathAbsLicPlgCur)";
strWarning += "\n" + ". strNamePlgCur=" + strNamePlgCur;
strWarning += "\n" + ". strVersionPlgCur=" + strVersionPlgCur;
strWarning += "\n" + ". strPathAbsLicPlgCur=" + strPathAbsLicPlgCur;
//strWarning += "\n" + "\n" + "... cleaning-up DB";
throw new Exception(strWarning);
}
GfrMdlPlg.getInstance().setActive((GfrPlgImplAbs) plgCur, true);
}
catch(Exception exc)
{
exc.printStackTrace();
String strWarning = exc.getMessage();
strWarning += "\n ... ignoring";
GfrAcrSpcAppMainOgcAbs._LOGGER_.warning(strWarning);
}
}
}
protected void _addPluginHandler(IGfrHandlerPlugin plg) throws Exception
{
if (plg == null)
return;
String strOk = "Successfully added plugin named\n " + "\"" + plg.getNamePlugin() + "\"";
GfrAcrSpcAppMainOgcAbs._LOGGER_.info(strOk);
if (plg instanceof IGfrHandlerLicensingPlugin)
{
strOk += "\n\n" + "This plug-in requires license to get it working";
GfrOptionPaneAbs.s_showDialogInfo(null, strOk);
IGfrHandlerLicensingPlugin hndPlgLic = (IGfrHandlerLicensingPlugin) plg;
if (! hndPlgLic.doJobOpenFileLicensePlugin())
{
String strWarning = "! hndPlgLic.openFileLicensePlugin()";
GfrAcrSpcAppMainOgcAbs._LOGGER_.warning(strWarning);
return;
}
GfrMdlPlg.getInstance().setActive((GfrPlgImplAbs) plg, true);
}
}
public void setLicensePluginHandler()
{
IGfrHandlerPlugin plg = ActionPluginSetLicense.s_getInstance().getPlugin();
if (plg == null)
{
String strError = "plg == null";
GfrAcrSpcAppMainOgcAbs._LOGGER_.severe(strError);
GfrOptionPaneAbs.s_showDialogError(null, strError);
return; // do not exit coz tbrl could comes from outside application (ie. 3rd party plugin)
}
if (! (plg instanceof IGfrHandlerLicensingPlugin))
{
String strError = "Dev coding error: ! (plg instanceof IGfrHandlerLicensingPlugin)";
GfrAcrSpcAppMainOgcAbs._LOGGER_.severe(strError);
GfrOptionPaneAbs.s_showDialogError(null, strError);
return; // ??? exit ???
}
// beg check license
/*
* if wrong:
* message dialog: either corrupted or wrong file
* delete path to file in DB
* Q: abort?
*/
IGfrHandlerLicensingPlugin hndPlgLic = (IGfrHandlerLicensingPlugin) plg;
if (! hndPlgLic.doJobOpenFileLicensePlugin())
{
String strWarning = "! hndPlgLic.openFileLicensePlugin()";
GfrAcrSpcAppMainOgcAbs._LOGGER_.warning(strWarning);
// ??? dialog ???
return;
}
GfrMdlPlg.getInstance().setActive((GfrPlgImplAbs) plg, true);
}
/*
* first run
*
*/
@Override
public boolean init()
{
if (!super.init())
return false;
_checkAndCleanupIfNeededHistories_(); // DONE IN A HURRY !!! to be optimized
_activateLicensedPluginsAtLaunchTime();
if (!this._acrActive.init())
return false;
return true;
}
private String[] _getWorkspaceChildrenHistory_(String strPathAbsWorkSpace) throws Exception
{
String strPathAbsDb = strPathAbsWorkSpace;
strPathAbsDb += java.io.File.separator;
strPathAbsDb += GfrPrpNamingBasDspUsr.STR_NAME_FILE_DB_SPACEWORK;
String[] strs = GfrWrpSqlGetTableRecordingsTarget.s_getInstance().doJob(
"",
"",
strPathAbsDb,
GfrBasTblUsrSpcPrtHistoryWork.s_getInstance(),
GfrBasTblUsrSpcPrtHistoryWork.FLD_VAR_CHAR_CHILD_VALUE);
return strs;
}
private String[] _getWorkspaceChildrenList_(String strPathAbsWorkSpace) throws Exception
{
String strPathAbsDb = strPathAbsWorkSpace;
strPathAbsDb += java.io.File.separator;
strPathAbsDb += GfrPrpNamingBasGrpChl.STR_NAME_FILE_DB_SPACEWORK;
String[] strs = GfrWrpSqlGetTableRecordingsTarget.s_getInstance().doJob(
"",
"",
strPathAbsDb,
GfrBasTblGrpProjects.s_getInstance(),
GfrBasTblGrpProjects.FLD_VAR_CHAR_NAME);
return strs;
}
private void _checkAndCleanupIfNeededHistories_()
{
try
{
String[] strsValueListWorkspaces = null;
// ---
strsValueListWorkspaces = GfrWrpBasDatSpcRoot.getInstance().getSortedPathsAbsolute();
_checkAndCleanupupIfNeededListRoot_(strsValueListWorkspaces);
// TODO cleanUp workspaces' projects in list if needed
strsValueListWorkspaces = GfrWrpBasDatSpcRoot.getInstance().getSortedPathsAbsolute();
_checkAndCleanupIfNeededHistoriesRoot_(strsValueListWorkspaces);
_checkAndCleanupIfNeededHistoriesWorks_(strsValueListWorkspaces);
}
catch (Exception exc)
{
exc.printStackTrace();
GfrAcrSpcAppMainOgcAbs._LOGGER_.info("exc caught, don't care"); // !!! not sure about that !!!
}
}
private void _checkAndCleanupupIfNeededListRoot_(String[] strsValueListWorkOri) throws Exception
{
if (strsValueListWorkOri == null)
return;
if (strsValueListWorkOri.length < 1)
return;
HashSet<String> setCleaned = new HashSet<String>();
// TODO
for (int i=0; i<strsValueListWorkOri.length; i++)
{
File fleCur = new File(strsValueListWorkOri[i]);
if (! fleCur.exists())
{
setCleaned.add(strsValueListWorkOri[i]);
continue;
}
if (! fleCur.canRead())
{
setCleaned.add(strsValueListWorkOri[i]);
continue;
}
if (! fleCur.isDirectory())
{
setCleaned.add(strsValueListWorkOri[i]);
continue;
}
}
if (setCleaned.isEmpty())
{
setCleaned = null;
return;
}
String[] strsToDelete = setCleaned.toArray(new String[setCleaned.size()]);
GfrWrpBasDatSpcRoot.getInstance().delete(strsToDelete);
setCleaned.clear();
setCleaned = null;
}
private void _checkAndCleanupIfNeededHistoriesWorks_(String[] strsValueListWorkspace) throws Exception
{
if (strsValueListWorkspace == null || strsValueListWorkspace.length == 0)
return;
for (int i = 0; i < strsValueListWorkspace.length; i++)
{
// get list projects
String[] strsWorkspaceChildrenList = _getWorkspaceChildrenList_(strsValueListWorkspace[i]);
// get history projects
String[] strsWorkspaceChildrenHistory = _getWorkspaceChildrenHistory_(strsValueListWorkspace[i]);
// ---
if (strsWorkspaceChildrenHistory==null || strsWorkspaceChildrenHistory.length<1)
{
continue;
}
HashSet<String> setValuesToDelete = new HashSet<String>();
for (int j=0; j<strsWorkspaceChildrenHistory.length; j++)
{
// inside list?
if (strsWorkspaceChildrenList == null || strsWorkspaceChildrenList.length < 1)
{
setValuesToDelete.add(strsWorkspaceChildrenHistory[j]);
continue;
}
if (!GfrUtlString.s_contains(strsWorkspaceChildrenList, strsWorkspaceChildrenHistory[j]))
{
setValuesToDelete.add(strsWorkspaceChildrenHistory[j]);
continue;
}
}
for (String strValueToDelete : setValuesToDelete)
{
_deleteChildProjectFromHistory(strsValueListWorkspace[i], strValueToDelete);
}
// ---
}
}
private void _deleteChildProjectFromHistory(String strPathAbsWorkspace, String strValue) throws Exception
{
String strPathAbsDb = strPathAbsWorkspace;
strPathAbsDb += java.io.File.separator;
strPathAbsDb += GfrPrpNamingBasDspUsr.STR_NAME_FILE_DB_SPACEWORK;
GfrWrpSqlRemoveRecordingKeyValue.s_getInstance().doJob(
"",
"",
strPathAbsDb,
GfrBasTblUsrSpcPrtHistoryWork.s_getInstance(),
GfrBasTblUsrSpcPrtHistoryWork.FLD_VAR_CHAR_CHILD_VALUE,
strValue);
}
private void _checkAndCleanupIfNeededHistoriesRoot_(String[] strsValueListWork) throws Exception
{
HashSet<String> setValuesToDelete = new HashSet<String>();
// TODO: get list
Object[] objs = GfrWrpUsrSpcDspPrtAppRoot.getInstance().getArrayValueDateChildrenFromHistory();
if (objs == null)
{
setValuesToDelete = null;
return;
}
if (objs.length < 1)
{
setValuesToDelete = null;
return;
}
for (int i = 0; i < objs.length; i++)
{
GfrValueDateHistory vdhCur = (GfrValueDateHistory) objs[i];
String strValueCur = vdhCur.getValue();
File fleCur = new File(strValueCur);
if (!fleCur.exists())
{
setValuesToDelete.add(strValueCur);
continue;
}
if (!fleCur.canRead())
{
setValuesToDelete.add(strValueCur);
continue;
}
// inside list?
if (strsValueListWork == null || strsValueListWork.length < 1)
{
setValuesToDelete.add(strValueCur);
continue;
}
if (!GfrUtlString.s_contains(strsValueListWork, strValueCur))
{
setValuesToDelete.add(strValueCur);
continue;
}
}
if (setValuesToDelete.size() < 1)
{
setValuesToDelete = null;
return;
}
for (String strValueToDelete : setValuesToDelete)
{
GfrWrpUsrSpcDspPrtAppRoot.getInstance().deleteChild(strValueToDelete);
}
setValuesToDelete.clear();
setValuesToDelete = null;
}
public void displaySpace() throws Exception
{
open();
String strLastSpaceRootVsWork = GfrWrpUsrSpcDspPrtAppRoot.getInstance().getLast();
// root
if (strLastSpaceRootVsWork.compareTo(GfrBasTblUsrSpcPrtHistoryAbs.STR_WHO_LAST_ME) == 0)
{
this._acrActive.open();
return;
}
// workspace or project
String strPathAbsLastAccessedWork = GfrWrpUsrSpcDspPrtAppRoot.getInstance().getValueLastChildFromHistory();
if (strPathAbsLastAccessedWork == null || strPathAbsLastAccessedWork.compareTo("") == 0)
{
this._acrActive.open();
return;
}
String strLastSpaceWorkVsProject = GfrWrpUsrSpcDspPrtAppWork.getInstance().getLast();
if (strLastSpaceWorkVsProject.compareTo(GfrBasTblUsrSpcPrtHistoryAbs.STR_WHO_LAST_ME) == 0)
{
this._acrActive.displayChild(strPathAbsLastAccessedWork);
return;
}
// ---
String strNameAccessedProject = GfrWrpUsrSpcDspPrtAppWork.getInstance().getValueLastChildFromHistory();
if (strNameAccessedProject == null || strNameAccessedProject.compareTo("") == 0)
{
this._acrActive.displayChild(strPathAbsLastAccessedWork);
return;
}
this._acrActive.displayGrandChild(strNameAccessedProject);
}
@Override
public void destroy()
{
super.destroy();
if (this._acrActive != null)
{
this._acrActive.destroy();
this._acrActive = null;
}
}
}