/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.app.util;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Class representing all DC inputs required for a submission, organized into pages
*
* @author Brian S. Hughes, based on work by Jenny Toves, OCLC
* @version $Revision$
*/
public class DCInputSet
{
/** name of the input set */
private String formName = null;
/** the inputs ordered by page and row position */
private DCInput[][] inputPages = null;
/** constructor
* @param formName form name
* @param pages pages
* @param listMap map
*/
public DCInputSet(String formName, List<List<Map<String, String>>> pages, Map<String, List<String>> listMap)
{
this.formName = formName;
inputPages = new DCInput[pages.size()][];
for ( int i = 0; i < inputPages.length; i++ )
{
List<Map<String, String>> page = pages.get(i);
inputPages[i] = new DCInput[page.size()];
for ( int j = 0; j < inputPages[i].length; j++ )
{
inputPages[i][j] = new DCInput(page.get(j), listMap);
}
}
}
/**
* Return the name of the form that defines this input set
* @return formName the name of the form
*/
public String getFormName()
{
return formName;
}
/**
* Return the number of pages in this input set
* @return number of pages
*/
public int getNumberPages()
{
return inputPages.length;
}
/**
* Get all the rows for a page from the form definition
*
* @param pageNum desired page within set
* @param addTitleAlternative flag to add the additional title row
* @param addPublishedBefore flag to add the additional published info
*
* @return an array containing the page's displayable rows
*/
public DCInput[] getPageRows(int pageNum, boolean addTitleAlternative,
boolean addPublishedBefore)
{
List<DCInput> filteredInputs = new ArrayList<DCInput>();
if ( pageNum < inputPages.length )
{
for (int i = 0; i < inputPages[pageNum].length; i++ )
{
DCInput input = inputPages[pageNum][i];
if (doField(input, addTitleAlternative, addPublishedBefore))
{
filteredInputs.add(input);
}
}
}
// Convert list into an array
DCInput[] inputArray = new DCInput[filteredInputs.size()];
return filteredInputs.toArray(inputArray);
}
/**
* Does this set of inputs include an alternate title field?
*
* @return true if the current set has an alternate title field
*/
public boolean isDefinedMultTitles()
{
return isFieldPresent("title.alternative");
}
/**
* Does this set of inputs include the previously published fields?
*
* @return true if the current set has all the prev. published fields
*/
public boolean isDefinedPubBefore()
{
return ( isFieldPresent("date.issued") &&
isFieldPresent("identifier.citation") &&
isFieldPresent("publisher.null") );
}
/**
* Does the current input set define the named field?
* Scan through every field in every page of the input set
*
* @param fieldName selects the field.
* @return true if the current set has the named field
*/
public boolean isFieldPresent(String fieldName)
{
for (int i = 0; i < inputPages.length; i++)
{
DCInput[] pageInputs = inputPages[i];
for (int row = 0; row < pageInputs.length; row++)
{
String fullName = pageInputs[row].getElement() + "." +
pageInputs[row].getQualifier();
if (fullName.equals(fieldName))
{
return true;
}
}
}
return false;
}
/**
* Does the current input set define the named field?
* and is valid for the specified document type
* Scan through every field in every page of the input set
*
* @param fieldName field name
* @param documentType doc type
* @return true if the current set has the named field
*/
public boolean isFieldPresent(String fieldName, String documentType)
{
if (documentType == null) {
documentType = "";
}
for (int i = 0; i < inputPages.length; i++)
{
DCInput[] pageInputs = inputPages[i];
for (int row = 0; row < pageInputs.length; row++)
{
String fullName = pageInputs[row].getElement() + "." +
pageInputs[row].getQualifier();
if (fullName.equals(fieldName) )
{
if (pageInputs[row].isAllowedFor(documentType)) {
return true;
}
}
}
}
return false;
}
protected boolean doField(DCInput dcf, boolean addTitleAlternative,
boolean addPublishedBefore)
{
String rowName = dcf.getElement() + "." + dcf.getQualifier();
if ( rowName.equals("title.alternative") && ! addTitleAlternative )
{
return false;
}
if (rowName.equals("date.issued") && ! addPublishedBefore )
{
return false;
}
if (rowName.equals("publisher.null") && ! addPublishedBefore )
{
return false;
}
if (rowName.equals("identifier.citation") && ! addPublishedBefore )
{
return false;
}
return true;
}
}