/* Index ECM Engine - A system for managing the capture (when created
* or received), classification (cataloguing), storage, retrieval,
* revision, sharing, reuse and disposition of documents.
*
* Copyright (C) 2008 Regione Piemonte
* Copyright (C) 2008 Provincia di Torino
* Copyright (C) 2008 Comune di Torino
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2,
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
package it.doqui.index.ecmengine.business.foundation.repository;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.NoSuchPaddingException;
import it.doqui.index.ecmengine.business.foundation.EcmEngineWrapperBean;
import it.doqui.index.ecmengine.business.foundation.util.FoundationBeansConstants;
import it.doqui.index.ecmengine.business.foundation.util.FoundationErrorCodes;
import it.doqui.index.ecmengine.business.personalization.encryption.CryptoContentService;
import it.doqui.index.ecmengine.business.personalization.encryption.CryptoTransformationSpec;
import it.doqui.index.ecmengine.business.personalization.encryption.CustomSecretKey;
import it.doqui.index.ecmengine.business.personalization.encryption.exception.EncryptionRuntimeException;
import it.doqui.index.ecmengine.exception.repository.ContentRuntimeException;
import it.doqui.index.ecmengine.util.EcmEngineConstants;
import org.alfresco.repo.content.transform.ContentTransformer;
import org.alfresco.service.cmr.dictionary.InvalidTypeException;
import org.alfresco.service.cmr.lock.NodeLockedException;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.InvalidNodeRefException;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.QName;
public class ContentSvcBean extends EcmEngineWrapperBean implements EcmEngineConstants, FoundationBeansConstants {
private static final long serialVersionUID = 8233020265470978732L;
public ContentWriter getWriter(NodeRef nodeRef, QName property, boolean arg2)
throws ContentRuntimeException {
logger.debug("[ContentSvcBean::getWriter] BEGIN");
ContentWriter writer = null;
try {
ContentService cs = (ContentService) serviceRegistry.getContentService();
writer = cs.getWriter(nodeRef, property, arg2);
} catch (Exception e) {
handleContentServiceException("getWriter", e);
} finally {
logger.debug("[ContentSvcBean::getWriter] END");
}
return writer;
}
public ContentWriter getTempWriter() throws ContentRuntimeException {
logger.debug("[ContentSvcBean::getTempWriter] BEGIN");
ContentWriter writer = null;
try {
ContentService cs = (ContentService)serviceRegistry.getContentService();
writer = cs.getTempWriter();
} catch (Exception e) {
handleContentServiceException("getTempWriter", e);
} finally {
logger.debug("[ContentSvcBean::getTempWriter] END");
}
return writer;
}
public ContentTransformer getImageTransformer() throws ContentRuntimeException {
logger.debug("[ContentSvcBean::getImageTransformer] BEGIN");
ContentTransformer transformer = null;
try {
ContentService cs = (ContentService)serviceRegistry.getContentService();
transformer = cs.getImageTransformer();
} catch (Exception e) {
handleContentServiceException("getImageTransformer", e);
} finally {
logger.debug("[ContentSvcBean::getImageTransformer] END");
}
return transformer;
}
public ContentTransformer getTransformer(String sourceMimetype, String targetMimetype) throws ContentRuntimeException {
logger.debug("[ContentSvcBean::getTransformer] BEGIN");
ContentTransformer transformer = null;
try {
ContentService cs = (ContentService)serviceRegistry.getContentService();
transformer = cs.getTransformer(sourceMimetype, targetMimetype);
} catch (Exception e) {
handleContentServiceException("getTransformer", e);
} finally {
logger.debug("[ContentSvcBean::getTransformer] END");
}
return transformer;
}
public ContentReader getReader(NodeRef nodeRef, QName propertyQName)
throws ContentRuntimeException {
logger.debug("[ContentSvcBean::getReader] BEGIN");
ContentReader reader = null;
try {
ContentService cs = (ContentService)serviceRegistry.getContentService();
reader = cs.getReader(nodeRef, propertyQName);
} catch (Exception e) {
handleContentServiceException("getReader", e);
} finally {
logger.debug("[ContentSvcBean::getReader] END");
}
return reader;
}
public boolean isTransformable(ContentReader reader, ContentWriter writer) throws ContentRuntimeException {
logger.debug("[ContentSvcBean::isTransformable] BEGIN");
boolean transformable = false;
try {
ContentService cs = (ContentService)serviceRegistry.getContentService();
transformable = cs.isTransformable(reader, writer);
} catch (Exception e) {
handleContentServiceException("isTransformable", e);
} finally {
logger.debug("[ContentSvcBean::isTransformable] END");
}
return transformable;
}
public void transform(ContentReader reader, ContentWriter writer) throws ContentRuntimeException {
logger.debug("[ContentSvcBean::transform] BEGIN");
try {
ContentService cs = (ContentService)serviceRegistry.getContentService();
cs.transform(reader, writer);
} catch (Exception e) {
handleContentServiceException("transform", e);
} finally {
logger.debug("[ContentSvcBean::transform] END");
}
}
public ContentReader getDecryptingReader(NodeRef nodeRef, QName propertyQName, CustomSecretKey key,
CryptoTransformationSpec transform) throws ContentRuntimeException {
logger.debug("[ContentSvcBean::getDecryptingReader] BEGIN");
ContentReader reader = null;
try {
ContentService cs = (ContentService) serviceRegistry.getContentService();
if (cs instanceof CryptoContentService) {
reader = ((CryptoContentService) cs).getDecryptingReader(
nodeRef, propertyQName, key, transform);
} else {
logger.warn("[ContentSvcBean::getDecryptingReader] Encryption not supported. Returning plain reader.");
reader = cs.getReader(nodeRef, propertyQName);
}
} catch (Exception e) {
handleContentServiceException("getDecryptingReader", e);
} finally {
logger.debug("[ContentSvcBean::getDecryptingReader] END");
}
return reader;
}
public ContentWriter getEncryptingWriter(NodeRef nodeRef, QName propertyQName, boolean update,
CustomSecretKey key, CryptoTransformationSpec transform) throws ContentRuntimeException {
logger.debug("[ContentSvcBean::getEncryptingWriter] BEGIN");
ContentWriter writer = null;
try {
ContentService cs = serviceRegistry.getContentService();
if (cs instanceof CryptoContentService) {
writer = ((CryptoContentService) cs).getEncryptingWriter(
nodeRef, propertyQName, update, key, transform);
} else {
logger.warn("[ContentSvcBean::getEncryptingWriter] Encryption not supported. Returning plain writer.");
writer = cs.getWriter(nodeRef, propertyQName, update);
}
} catch (Exception e) {
handleContentServiceException("getEncryptingWriter", e);
} finally {
logger.debug("[ContentSvcBean::getEncryptingWriter] END");
}
return writer;
}
public boolean supportsCryptography() {
logger.debug("[ContentSvcBean::supportsCryptography] BEGIN");
try {
return (serviceRegistry.getContentService() instanceof CryptoContentService);
} finally {
logger.debug("[ContentSvcBean::supportsCryptography] END");
}
}
private void handleContentServiceException(String methodName, Throwable e) throws ContentRuntimeException {
logger.warn("[ContentSvcBean::handleContentServiceException] Exception in method '" + methodName + "': " + e.getMessage(), e);
if (e instanceof org.alfresco.repo.security.permissions.AccessDeniedException) {
throw new ContentRuntimeException(FoundationErrorCodes.ACCESS_DENIED_ERROR);
} else if (e instanceof NodeLockedException) {
throw new ContentRuntimeException(FoundationErrorCodes.NODE_LOCKED_ERROR);
} else if (e instanceof InvalidNodeRefException) {
throw new ContentRuntimeException(FoundationErrorCodes.INVALID_NODE_REF_ERROR);
} else if (e instanceof InvalidTypeException) {
throw new ContentRuntimeException(FoundationErrorCodes.INVALID_TYPE_ERROR);
} else if (e instanceof EncryptionRuntimeException) {
if (e.getCause() == null) {
// Causa sconosciuta -> errore generico
throw new ContentRuntimeException(FoundationErrorCodes.ENCRYPTION_GENERIC_ERROR);
} else if (e.getCause() instanceof NoSuchAlgorithmException) {
throw new ContentRuntimeException(FoundationErrorCodes.ENCRYPTION_INVALID_ALGORITHM_ERROR);
} else if (e.getCause() instanceof InvalidKeyException) {
throw new ContentRuntimeException(FoundationErrorCodes.ENCRYPTION_INVALID_KEY_ERROR);
} else if (e.getCause() instanceof NoSuchPaddingException) {
throw new ContentRuntimeException(FoundationErrorCodes.ENCRYPTION_INVALID_PADDING_ERROR);
} else if (e.getCause() instanceof InvalidAlgorithmParameterException) {
throw new ContentRuntimeException(FoundationErrorCodes.ENCRYPTION_INVALID_PARAM_ERROR);
} else {
throw new ContentRuntimeException(FoundationErrorCodes.ENCRYPTION_GENERIC_ERROR);
}
} else {
throw new ContentRuntimeException(FoundationErrorCodes.GENERIC_CONTENT_SERVICE_ERROR);
}
}
}