/*******************************************************************************
* Copyright 2006 - 2012 Vienna University of Technology,
* Department of Software Technology and Interactive Systems, IFS
*
* Licensed 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 eu.scape_project.planning.xml.plan;
import java.io.Serializable;
import java.lang.reflect.Method;
import org.apache.commons.codec.binary.Base64;
import eu.scape_project.planning.model.ByteStream;
import eu.scape_project.planning.xml.PlanXMLConstants;
/**
* Helper class for {@link eu.scape_project.planning.xml.ProjectImporter} to
* decode Base64 encoded strings. Can set the decoded data to other objects
* which have a function setData(byte[] data)
*
* @author Michael Kraxner
*
*/
public class BinaryDataWrapper implements Serializable {
private static final long serialVersionUID = 2080538998419720006L;
private static final Base64 decoder = new Base64(PlanXMLConstants.BASE64_LINE_LENGTH, PlanXMLConstants.BASE64_LINE_BREAK);
byte[] value = null;
/**
* The methodName used to set the data to the object on the stack.
* By default the method "setData" is used.
*/
private String methodName = "setData";
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
/**
* Decodes the Base64 encoded string <code>value</code> and keep this data
* for the next call of {@link #setData(Object)}
*
* @param value
*/
public void setFromBase64Encoded(String value) {
this.value = decoder.decode(value); //decoder.encodeBase64(binaryData, isChunked)decode(value.replaceAll("\\s", ""));
}
/**
* Invokes the function "setData" on <code>object</code> via reflection -
* with previously decoded data as parameter.
*
* @param object
*/
public void setData(Object object) {
try {
ByteStream data = new ByteStream();
data.setData(value);
data.setSize(value.length);
Method setData = object.getClass().getMethod(methodName, ByteStream.class);
setData.invoke(object, new Object[] {data});
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Invokes the previously set function <methodName> on <code>object</code>
* via reflection - with previously decoded data as parameter.
*
* @param object
*/
public void setString(Object object) {
try {
Method setData = object.getClass().getMethod(methodName, String.class);
String dataString = new String(value, PlanXMLConstants.ENCODING_CHARSET).replaceAll("\uFFFD", "");
setData.invoke(object, new Object[] {dataString});
} catch (Exception e) {
e.printStackTrace();
}
}
}