blob: 8ee1bcb76b89dd5a3e9901e7315e3795cefb3336 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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 org.apache.felix.upnp.basedriver.util;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import org.apache.xerces.impl.dv.util.Base64;
import org.apache.xerces.impl.dv.util.HexBin;
import org.osgi.service.upnp.UPnPStateVariable;
/**
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class Converter {
/**
*
* @param value Object that contain the value
* @param upnpType String conating the UPnP Type of the Object
* @return a String that contain the UPnP rappresentation of the value contained in Object
* of type specified by typeUPnP
*/
public static String toString(Object value,String upnpType) throws Exception{
if((value==null)||(upnpType==null))
throw new NullPointerException("Must be specified a valid value and upnpType");
if(value instanceof Number){
if(value instanceof Integer){
return value.toString();
}else if(value instanceof Float){
return value.toString();
}else if(value instanceof Long){
if(upnpType.equals(UPnPStateVariable.TYPE_TIME)){
long l = ((Long)value).longValue();
if(l<0) throw new IllegalArgumentException(l+ "Must be greater than 0");
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY,(int) (l/3600000));
int x=(int) (l % 3600000);
c.set(Calendar.MINUTE,(int) (x / 60000));
c.set(Calendar.SECOND,(x % 60000)/1000);
SimpleDateFormat sdt = new SimpleDateFormat("HH:mm:ss");
return sdt.format(c.getTime());
}else if(upnpType.equals(UPnPStateVariable.TYPE_TIME_TZ)){
long l = ((Long)value).longValue();
if(l<0) throw new IllegalArgumentException(l+ "Must be greater than 0");
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY,(int) (l/3600000));
int x=(int) (l % 3600000);
c.set(Calendar.MINUTE,(int) (x / 60000));
c.set(Calendar.SECOND,(x % 60000)/1000);
SimpleDateFormat sdt = new SimpleDateFormat("HH:mm:ssZ");
return sdt.format(c.getTime());
}else{
//Must be UPnPStateVariable.TYPE_UI4)
return value.toString();
}
}else if(value instanceof Double){
if(upnpType.equals(UPnPStateVariable.TYPE_FIXED_14_4)){
return Long.toString(((Double)value).longValue())+"."+
Integer.toString((int) (((((Double)value).doubleValue()*10000D) % 10000)));
}else{
//Must be UPnPStateVariable.TYPE_R8 or UPnPStateVariable.TYPE_NUMBER
return value.toString();
}
}
}else if(value instanceof Date){
if(upnpType.equals("dateTime")){
SimpleDateFormat sdt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
return sdt.format(value);
}else if(upnpType.equals("dateTime.tz")){
SimpleDateFormat sdt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
return sdt.format(value);
}else if(upnpType.equals("date")){
SimpleDateFormat sdt = new SimpleDateFormat("yyyy-MM-dd");
return sdt.format(value);
}
}else if(value instanceof Boolean){
//Must be UPnPStateVariable.TYPE_BOOLEAN
if(((Boolean)value).booleanValue()){
return "1";
}else{
return "0";
}
}else if(value instanceof Character){
//Must be UPnPStateVariable.TYPE_CHAR
return value.toString();
}else if(value instanceof String){
return value.toString();
//Must be one of
// UPnPStateVariable.TYPE_STRING or
// UPnPStateVariable.TYPE_URI or
// UPnPStateVariable.TYPE_UUID
}else if(value instanceof byte[]){
if(upnpType.equals("bin.hex")){
return HexBin.encode((byte[]) value);
}else if(upnpType.equals("bin.base64")){
return Base64.encode((byte[]) value);
}
}
throw new IllegalArgumentException("Invalid Binding");
}
/**
*
* @param value
* @param upnpType
* @return
*/
public static Object parseString(String value,String upnpType) throws Exception{
if (value ==null && upnpType.equals("string"))
value = "";
if((value==null)||(upnpType==null))
throw new NullPointerException("Must be specified a valid value and upnpType");
if (upnpType.equals("ui1") || upnpType.equals("ui2")
|| upnpType.equals("i1") || upnpType.equals("i2")
|| upnpType.equals("i4") || upnpType.equals("int")) {
return new Integer(value);
} else if (upnpType.equals("ui4")){
return new Long(value);
} else if(upnpType.equals("time")){
String[] timeFormats=new String[]{"HH:mm:ss"};
Date d=getDateValue(value,timeFormats,timeFormats);
Calendar c = Calendar.getInstance();
c.setTime(d);
return new Long(
c.get(Calendar.HOUR_OF_DAY)*3600000
+c.get(Calendar.MINUTE)*60000
+c.get(Calendar.SECOND)*1000
);
} else if(upnpType.equals("time.tz")) {
String[] timeFormats=new String[]{"HH:mm:ssZ","HH:mm:ss"};
Date d=getDateValue(value,timeFormats,timeFormats);
TimeZone tz = TimeZone.getDefault();
Calendar c = Calendar.getInstance(tz);
c.setTime(d);
if(timeFormats[0].equals("HH:mm:ssZ")&&(tz.inDaylightTime(d)))
c.add(Calendar.MILLISECOND,3600000);
return new Long(
c.get(Calendar.HOUR_OF_DAY)*3600000
+c.get(Calendar.MINUTE)*60000
+c.get(Calendar.SECOND)*1000
);
} else if (upnpType.equals("r4") || upnpType.equals("float")) {
return new Float(value);
} else if (upnpType.equals("r8") || upnpType.equals("number")
|| upnpType.equals("fixed.14.4")){
return new Double(value);
} else if (upnpType.equals("char")) {
return new Character(value.charAt(0));
} else if (upnpType.equals("string") || upnpType.equals("uri")
|| upnpType.equals("uuid")) {
return value;
} else if (upnpType.equals("date")) {
String[] timeFormats=new String[]{"yyyy-MM-dd"};
Date d=getDateValue(value,timeFormats,timeFormats);
return d;
} else if (upnpType.equals("dateTime")) {
String[] timeFormats=new String[]{
"yyyy-MM-dd",
"yyyy-MM-dd'T'HH:mm:ss"
};
Date d=getDateValue(value,timeFormats,timeFormats);
return d;
} else if (upnpType.equals("dateTime.tz")) {
String[] timeFormats=new String[]{
"yyyy-MM-dd",
"yyyy-MM-dd'T'HH:mm:ss",
"yyyy-MM-dd'T'HH:mm:ssZ"
};
Date d=getDateValue(value,timeFormats,timeFormats);
return d;
} else if (upnpType.equals("boolean")) {
if(value.equalsIgnoreCase("yes") || value.equalsIgnoreCase("true")
|| value.equalsIgnoreCase("1"))
return Boolean.TRUE;
else
return Boolean.FALSE;
} else if (upnpType.equals("bin.base64")) {
return Base64.decode(value);
} else if (upnpType.equals("bin.hex")) {
return HexBin.decode(value);
}
throw new IllegalArgumentException("Invalid Binding");
}
private static String normalizeTimeZone(String value){
if(value.endsWith("Z")){
value=value.substring(0,value.length()-1)+"+0000";
}else if((value.length()>7)
&&(value.charAt(value.length()-3)==':')
&&((value.charAt(value.length()-6)=='-')||(value.charAt(value.length()-6)=='+'))){
value=value.substring(0,value.length()-3)+value.substring(value.length()-2);
}
return value;
}
/**
* @param value
* @param timeFormats
* @param choosedIndex
* @return
* @throws ParseException
*/
private static Date getDateValue(String value, String[] timeFormats, String[] choosedIndex) throws ParseException {
ParsePosition position = null;
Date d;
value=normalizeTimeZone(value);
for (int i=0; i<timeFormats.length; i++) {
position = new ParsePosition(0);
SimpleDateFormat sdt = new SimpleDateFormat(timeFormats[i]);
d=sdt.parse(value,position);
if(d!=null){
if(position.getIndex()>=value.length()){
choosedIndex[0]=timeFormats[i];
return d;
}
}
}
throw new ParseException("Error parsing "+value,position.getIndex());
}
}