/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/archive/trunk/archive-tool/tool/src/java/org/sakaiproject/archive/tool/ArchiveAction.java $
* $Id: ArchiveAction.java 105078 2012-02-24 23:00:38Z ottenhoff@longsight.com $
***********************************************************************************
*
* Copyright (c) 2003, 2004, 2005, 2006, 2008 The Sakai Foundation
*
* Licensed under the Educational Community 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.opensource.org/licenses/ECL-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.sakaiproject.archive.tool;
import java.util.Enumeration;
import java.util.Hashtable;
import org.apache.commons.lang.StringUtils;
import org.sakaiproject.archive.cover.ArchiveService;
import org.sakaiproject.authz.cover.SecurityService;
import org.sakaiproject.cheftool.Context;
import org.sakaiproject.cheftool.JetspeedRunData;
import org.sakaiproject.cheftool.RunData;
import org.sakaiproject.cheftool.VelocityPortlet;
import org.sakaiproject.cheftool.VelocityPortletPaneledAction;
import org.sakaiproject.cheftool.api.Menu;
import org.sakaiproject.cheftool.menu.MenuEntry;
import org.sakaiproject.cheftool.menu.MenuImpl;
import org.sakaiproject.event.api.SessionState;
import org.sakaiproject.id.cover.IdManager;
import org.sakaiproject.util.FileItem;
import org.sakaiproject.util.ResourceLoader;
/**
* <p>ArchiveAction is the Sakai archive tool.</p>
*/
public class ArchiveAction
extends VelocityPortletPaneledAction
{
private static final String STATE_MODE = "mode";
private static final String BATCH_MODE = "batch";
/** Resource bundle using current language locale */
private static ResourceLoader rb = new ResourceLoader("admin");
/**
* build the context
*/
public String buildMainPanelContext(VelocityPortlet portlet,
Context context,
RunData rundata,
SessionState state)
{
String template = null;
// if not logged in as the super user, we won't do anything
if (!SecurityService.isSuperUser())
{
context.put("tlang",rb);
return (String) getContext(rundata).get("template") + "_noaccess";
}
// check mode and dispatch
String mode = (String) state.getAttribute(STATE_MODE);
if (mode == null)
{
template = buildListPanelContext(portlet, context, rundata, state);
}
else if (mode.equals(BATCH_MODE))
{
template = buildBatchPanelContext(portlet, context, rundata, state);
}
return (String)getContext(rundata).get("template") + template;
} // buildMainPanelContext
/**
* build the context for non-batch import/export
*/
public String buildListPanelContext(VelocityPortlet portlet,
Context context,
RunData rundata,
SessionState state)
{
context.put("tlang",rb);
// build the menu
Menu bar = new MenuImpl();
bar.add( new MenuEntry(rb.getString("archive.button.batch"), "doToggle_State") );
context.put(Menu.CONTEXT_MENU, bar);
context.put (Menu.CONTEXT_ACTION, "ArchiveAction");
return "";
} // buildListPanelContext
/**
* build the context for batch import/export
*/
public String buildBatchPanelContext(VelocityPortlet portlet,
Context context,
RunData rundata,
SessionState state)
{
context.put("tlang",rb);
//build the menu
Menu bar = new MenuImpl();
bar.add( new MenuEntry(rb.getString("archive.button.nonbatch"), "doToggle_State") );
context.put(Menu.CONTEXT_MENU, bar);
context.put (Menu.CONTEXT_ACTION, "ArchiveAction");
return "-batch";
} // buildListPanelContext
/**
*
*/
public void doToggle_State(RunData data, Context context)
{
String peid = ((JetspeedRunData) data).getJs_peid();
SessionState state = ((JetspeedRunData) data).getPortletSessionState(peid);
if (state.getAttribute(STATE_MODE) == null)
{
state.setAttribute(STATE_MODE, BATCH_MODE);
}
else
{
state.removeAttribute(STATE_MODE);
}
} // doToggle_State
/**
* doArchive called when "eventSubmit_doArchive" is in the request parameters
* to run the archive.
*/
public void doArchive(RunData data, Context context)
{
SessionState state = ((JetspeedRunData)data).getPortletSessionState(((JetspeedRunData)data).getJs_peid());
if (!SecurityService.isSuperUser())
{
addAlert(state, rb.getString("archive.limited"));
return;
}
String id = data.getParameters().getString("archive-id");
if ((id != null) && (id.trim().length() > 0))
{
String msg = ArchiveService.archive(id.trim());
addAlert(state, rb.getFormattedMessage("archive", new Object[]{id}) + " \n " + msg);
}
else
{
addAlert(state, rb.getString("archive.please"));
}
} // doArchive
/**
* doImport called when "eventSubmit_doImport" is in the request parameters
* to run an import.
*/
public void doImport(RunData data, Context context)
{
SessionState state = ((JetspeedRunData)data).getPortletSessionState(((JetspeedRunData)data).getJs_peid());
if (!SecurityService.isSuperUser())
{
addAlert(state, rb.getString("archive.import"));
return;
}
String id = data.getParameters().getString("import-id");
String file = data.getParameters().getString("import-file");
if ( (id != null) && (id.trim().length() > 0)
&& (file != null) && (file.trim().length() > 0))
{
String msg = ArchiveService.merge(file.trim(), id.trim(), null);
addAlert(state, rb.getFormattedMessage("archive.import2", new Object[]{file, id}) + msg);
}
else
{
addAlert(state, rb.getString("archive.file"));
}
} // doImport
/**
* doImport called when "eventSubmit_doImport" is in the request parameters
* to run an import.
*/
public void doBatch_Import(RunData data, Context context)
{
SessionState state = ((JetspeedRunData)data).getPortletSessionState(((JetspeedRunData)data).getJs_peid());
Hashtable fTable = new Hashtable();
if (!SecurityService.isSuperUser())
{
addAlert(state, rb.getString("archive.batch.auth"));
return;
}
//String fileName = data.getParameters().getString("import-file");
FileItem fi = data.getParameters().getFileItem ("importFile");
if (fi == null)
{
addAlert(state, rb.getString("archive.batch.missingname"));
}
else
{
// get content
String content = fi.getString();
String[] lines = content.split("\n");
for(int i=0; i<lines.length; i++)
{
String lineContent = (String) lines[i];
String[] lineContents = lineContent.split("\t");
if (lineContents.length == 2)
{
fTable.put(lineContents[0], lineContents[1]);
}
else
{
addAlert(state, rb.getString("archive.batch.wrongformat"));
}
}
}
if (!fTable.isEmpty())
{
Enumeration importFileName = fTable.keys();
int count = 1;
while (importFileName.hasMoreElements())
{
String path = StringUtils.trimToNull((String) importFileName.nextElement());
String siteCreatorName = StringUtils.trimToNull((String) fTable.get(path));
if (path != null && siteCreatorName != null)
{
String nSiteId = IdManager.createUuid();
try
{
Object[] params = new Object[]{count, path, nSiteId, siteCreatorName};
addAlert(state, rb.getFormattedMessage("archive.import1", params));
addAlert(state, ArchiveService.merge(path, nSiteId, siteCreatorName));
}
catch (Exception ignore)
{
}
}
count++;
}
}
} // doBatchImport
} // ArchiveAction