/*******************************************************************************
* Copyright 2009, 2010 Innovation Gate GmbH. All Rights Reserved.
*
* This file is part of the OpenWGA server platform.
*
* OpenWGA 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 3 of the License, or
* (at your option) any later version.
*
* In addition, a special exception is granted by the copyright holders
* of OpenWGA called "OpenWGA plugin exception". You should have received
* a copy of this exception along with OpenWGA in file COPYING.
* If not, see <http://www.openwga.com/gpl-plugin-exception>.
*
* OpenWGA 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 OpenWGA in file COPYING.
* If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package de.innovationgate.webgate.api.templates;
import java.io.File;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.commons.jxpath.JXPathContext;
import org.apache.commons.jxpath.JXPathException;
import de.innovationgate.webgate.api.WGAPIException;
import de.innovationgate.webgate.api.WGBackendException;
import de.innovationgate.webgate.api.WGContent;
import de.innovationgate.webgate.api.WGDocument;
import de.innovationgate.webgate.api.WGDocumentCore;
import de.innovationgate.webgate.api.WGExpressionException;
import de.innovationgate.webgate.api.WGFileMetaData;
import de.innovationgate.webgate.api.WGIllegalArgumentException;
import de.innovationgate.webgate.api.WGNotSupportedException;
import de.innovationgate.webgate.api.WGRelationData;
import de.innovationgate.webgate.api.WGSessionContext;
import de.innovationgate.webgate.api.WGSystemException;
import de.innovationgate.webgate.api.fake.WGFakeDocument;
/**
* A wrapper object that takes a JavaBean storage object and serves it's data as document core.
* Is used by SimpleContentSource.
*/
public class BeanWrapper extends Object implements WGDocumentCore {
private boolean _temporary;
private boolean _lowerCaseItems;
private boolean _saved;
private WGContent _doc;
private boolean _deleted = false;
private ArrayList _items;
Object _bean = null;
BeanKey _key = null;
String _fakeLanguage = null;
protected SimpleContentSource _db = null;
JXPathContext _context = null;
/**
* Constructor. Not to be used outside WGAPI.
* @param db
* @param key
* @param bean
* @param saved
* @param temporary
*/
public BeanWrapper(SimpleContentSource db, BeanKey key, Object bean, boolean saved, boolean temporary) {
_key = key;
_bean = bean;
_db = db;
_fakeLanguage = db.getFakeLanguage();
_context = JXPathContext.newContext(_bean);
_saved = saved;
_temporary = temporary;
_lowerCaseItems = db.getSpecs().isLowerCaseItems();
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#getType()
*/
public int getType() {
return WGDocument.TYPE_CONTENT;
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#getFastAccessKey()
*/
public Object getFastAccessKey() {
return _key;
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#isDeleted()
*/
public boolean isDeleted() {
return _deleted;
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#isTemporary()
*/
public boolean isTemporary() {
return _temporary;
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#hasItem(java.lang.String)
*/
public boolean hasItem(String strName) {
// B000049F6
if (strName != null && isLowerCaseItems()) {
strName = strName.toLowerCase();
}
return getItemNames().contains(strName);
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#getItemValue(java.lang.String)
*/
public Object getItemValue(String strName) {
if (strName != null && isLowerCaseItems()) {
strName = strName.toLowerCase();
}
try {
return _context.getValue(strName);
}
catch (org.apache.commons.jxpath.JXPathException e) {
return null;
}
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#getMetaData(java.lang.String)
*/
public Object getMetaData(String type) throws WGSystemException, WGIllegalArgumentException {
if (type.equals(WGContent.META_STRUCTENTRY)) {
return _key;
}
// See if we should return meta properties anyway. If not always return default
if (!_db.getSpecs().isServePropertiesAsMetas()) {
return WGFakeDocument.getMetaDataDefault(WGDocument.TYPE_CONTENT, type, _fakeLanguage);
}
// Try to retrieve meta from bean. Else get default
try {
return _context.getValue(type.toLowerCase());
}
catch (JXPathException e) {
return WGFakeDocument.getMetaDataDefault(WGDocument.TYPE_CONTENT, type, _fakeLanguage);
}
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#getFileNames()
*/
public List getFileNames() {
return null;
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#getFileData(java.lang.String)
*/
public InputStream getFileData(String strFile) {
return null;
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#getFileSize(java.lang.String)
*/
public int getFileSize(String strFile) {
return 0;
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#getCreated()
*/
public Date getCreated() throws WGSystemException, WGIllegalArgumentException {
return (Date) getMetaData(WGDocument.META_CREATED);
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#getLastModified()
*/
public Date getLastModified() throws WGSystemException, WGIllegalArgumentException {
return (Date) getMetaData(WGDocument.META_LASTMODIFIED);
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#setItemValue(java.lang.String, java.lang.Object)
*/
public boolean setItemValue(String strName, Object value) {
if (strName != null && _lowerCaseItems) {
strName = strName.toLowerCase();
}
try {
_context.setValue(strName, value);
return true;
}
catch (org.apache.commons.jxpath.JXPathException e) {
return false;
}
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#setMetaData(java.lang.String, java.lang.Object)
*/
public boolean setMetaData(String name, Object value) {
// See if we should return meta properties anyway. Cancel if not.
if (!_db.getSpecs().isServePropertiesAsMetas()) {
return false;
}
try {
_context.setValue(name, value);
return true;
}
catch (JXPathException e) {
return false;
}
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#save()
*/
public boolean save(java.util.Date lastModified) throws WGAPIException {
Object key;
if (_db.getSpecs().isCalculatesKeys()) {
_key = new BeanKey(_key.getFolder(), _db.calculateKey(_key.getFolder(), _bean));
}
boolean result;
if (isSaved()) {
result = _db.updateContent(_key.getFolder(), _key.getKey(), _bean);
}
else {
result = _db.insertContent(_key.getFolder(), _key.getKey(), _bean);
}
_saved = result;
return result;
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#evaluateExpression(java.lang.String)
*/
public Object evaluateExpression(String expression) throws WGExpressionException {
return null;
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#setWGDocument(de.innovationgate.webgate.api.WGDocument)
*/
public void setWGDocument(WGDocument doc) {
_doc = (WGContent) doc;
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#dispose()
*/
public void dispose() {
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#getItemNames()
*/
public List getItemNames() {
if (_items == null) {
Method[] methods = _bean.getClass().getMethods();
_items = new ArrayList();
Method method;
for (int i = 0; i < methods.length; i++) {
method = methods[i];
String methodName = method.getName();
if (isLowerCaseItems()) {
methodName = methodName.toLowerCase();
}
if (methodName.startsWith("get")) {
_items.add(methodName.substring(3));
}
else if (methodName.startsWith("is")) {
_items.add(methodName.substring(2));
}
}
}
return _items;
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#removeItem(java.lang.String)
*/
public boolean removeItem(String Name) {
return false;
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#isDataCacheable()
*/
public boolean isDataCacheable() {
return true;
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#attachFile(java.io.File)
*/
public boolean attachFile(File file) {
return false;
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#removeFile(java.lang.String)
*/
public boolean removeFile(String name) {
return false;
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#remove()
*/
public boolean remove() throws WGAPIException {
_db.removeContent(_key.getFolder(), _key.getKey());
if(_doc != null) {
// Struct entry must also be deleted bc. it would remain cached otherwise
WGSessionContext sessionContext = _doc.getDatabase().getSessionContext();
boolean cascadeDeletions = sessionContext.isCascadeDeletions();
sessionContext.setCascadeDeletions(false);
_doc.getStructEntry().remove();
sessionContext.setCascadeDeletions(true);
}
_deleted = true;
return true;
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#isSaved()
*/
public boolean isSaved() {
return _saved;
}
/* (Kein Javadoc)
* @see de.innovationgate.webgate.api.WGDocumentCore#getNativeObject()
*/
public Object getNativeObject() {
return _bean;
}
protected boolean isLowerCaseItems() {
return _lowerCaseItems;
}
public String getOriginDatabase() {
return _db.getDb().getDbReference();
}
public void renameFile(String oldFileName, String newFileName)
throws WGAPIException {
throw new WGNotSupportedException("renameFile() is not supported on this document implementation.");
}
public WGFileMetaData getFileMetaData(String strFile) throws WGAPIException {
throw new WGNotSupportedException("getFileMetaData() is not supported on this document implementation.");
}
public WGDocumentCore getRelation(String name) throws WGAPIException {
throw new WGNotSupportedException("Content Relations are not supported");
}
public WGDocumentCore removeRelation(String name) throws WGAPIException {
throw new WGNotSupportedException("Content Relations are not supported");
}
public WGDocumentCore setRelation(String name, WGDocumentCore target) throws WGAPIException {
throw new WGNotSupportedException("Content Relations are not supported");
}
public List<String> getRelationNames() throws WGAPIException {
throw new WGNotSupportedException("Content Relations are not supported");
}
public boolean hasFileMetadata() throws WGAPIException {
return false;
}
public boolean hasFile(String file) throws WGBackendException {
return false;
}
public WGRelationData getRelationData(String name) throws WGAPIException {
throw new WGNotSupportedException("Content relations are not supported");
}
public WGDocumentCore setRelation(WGRelationData data) throws WGAPIException {
throw new WGNotSupportedException("Content relations are not supported");
}
public Object getExtensionData(String strName) throws WGAPIException {
throw new WGNotSupportedException("Attributes are not supported"); }
public List getExtensionDataNames() throws WGAPIException {
throw new WGNotSupportedException("Attributes are not supported"); }
public void removeExtensionData(String strName) throws WGAPIException {
throw new WGNotSupportedException("Attributes are not supported"); }
public void writeExtensionData(String strName, Object value) throws WGAPIException {
throw new WGNotSupportedException("Attributes are not supported");
}
public List<String> getRelationNamesOfGroup(String group) throws WGBackendException {
throw new WGNotSupportedException("Content relations are not supported");
}
}