/* See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* Esri Inc. licenses this file to You 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.
*/
package com.esri.gpt.control.publication;
import com.esri.gpt.catalog.publication.ValidationRequest;
import com.esri.gpt.catalog.schema.Schema;
import com.esri.gpt.catalog.schema.ValidationException;
import com.esri.gpt.framework.context.RequestContext;
import com.esri.gpt.framework.jsf.BaseActionListener;
import com.esri.gpt.framework.jsf.MessageBroker;
import com.esri.gpt.framework.util.Val;
import javax.faces.application.FacesMessage;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
/**
* Provides matadata validation.
*/
public class ValidateMetadataController extends BaseActionListener {
/**
* Handles a metadata file upload action.
* <br/>This is the default entry point for a sub-class of BaseActionListener.
* <br/>This BaseActionListener handles the JSF processAction method and
* invokes the processSubAction method of the sub-class.
* @param event the associated JSF action event
* @param context the context associated with the active request
* @throws AbortProcessingException if processing should be aborted
* @throws Exception if an exception occurs
*/
@Override
protected void processSubAction(ActionEvent event, RequestContext context)
throws AbortProcessingException, Exception {
verifyFile(event,context);
}
/**
* Verifies the uploaded file.
* @param event the associated JSF action event
* @param context the context associated with the active request
* @throws Exception if an exception occurs
*/
private void verifyFile(ActionEvent event, RequestContext context)
throws Exception {
// extract the uploaded file information from the request,
// ensure that a file with valid XML content was supplied
MessageBroker msgBroker = extractMessageBroker();
String sFileName = "";
try {
FileItem item = extractFileItem();
if (item != null) {
sFileName = Val.chkStr(item.getName());
String sXml = Val.chkStr(item.getString("UTF-8"));
// remove the UTF-8 byte order mark if present
byte[] bom = new byte[3];
bom[0] = (byte)0xEF;
bom[1] = (byte)0xBB;
bom[2] = (byte)0xBF;
String sbom = new String(bom,"UTF-8");
if (sXml.startsWith(sbom)) {
sXml = Val.chkStr(sXml.substring(1));
}
if (sFileName.length() == 0) {
msgBroker.addErrorMessage("publication.validateMetadata.err.file.required");
} else if (sXml.length() == 0) {
msgBroker.addErrorMessage("publication.validateMetadata.err.file.empty");
} else {
//String sOut = "C:/xfer/test19139.xml";
//com.esri.gpt.framework.xml.XmlIoUtil.writeXmlFile(sXml,new java.io.File(sOut));
// verifies the file, set the success message
ValidationRequest request = new ValidationRequest(context,sFileName,sXml);
request.verify();
msgBroker.addSuccessMessage("catalog.publication.success.validated");
}
}
} catch (ValidationException e) {
FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_WARN,sFileName,null);
msgBroker.addMessage(fm);
String sKey = e.getKey();
if (sKey.length() > 0) {
String sMsg = sKey;
Schema schema = context.getCatalogConfiguration().getConfiguredSchemas().get(sKey);
if (schema != null) {
if (schema.getLabel() != null) {
String sResKey = schema.getLabel().getResourceKey();
if (sResKey.length() > 0) {
sMsg = extractMessageBroker().retrieveMessage(sResKey)+" ("+sKey+")";
}
}
}
fm = new FacesMessage(FacesMessage.SEVERITY_WARN," - "+sMsg,null);
extractMessageBroker().addMessage(fm);
}
e.getValidationErrors().buildMessages(msgBroker,true);
} catch (Exception e) {
FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_WARN,sFileName,null);
msgBroker.addMessage(fm);
// there seems to be no good exception related to a file that is simply
// not an XML file, a message containing "content is not allowed in prolog"
// seems to be the best guess at the moment
String sMsg = e.toString().toLowerCase();
if (sMsg.indexOf("content is not allowed in prolog") != -1) {
msgBroker.addErrorMessage("publication.validateMetadata.err.file.prolog");
} else {
throw e;
}
}
}
/**
* Extracts the file item placed in the HTTP servlet request
* by the MultipartFilter.
* @return the uploaded file item (null if none)
*/
private FileItem extractFileItem() {
FileItem item = null;
HttpServletRequest httpReq = getContextBroker().extractHttpServletRequest();
if (httpReq != null) {
Object oFile = httpReq.getAttribute("validate:validateXml");
if ((oFile != null) && (oFile instanceof FileItem)) {
item = (FileItem)oFile;
}
}
return item;
}
}