1 17 package org.alfresco.jcr.item; 18 19 import java.io.InputStream ; 20 import java.util.Calendar ; 21 import java.util.Date ; 22 23 import javax.jcr.RepositoryException; 24 import javax.jcr.ValueFormatException; 25 26 import org.alfresco.jcr.session.SessionImpl; 27 import org.alfresco.service.cmr.dictionary.DataTypeDefinition; 28 import org.alfresco.service.cmr.repository.NodeRef; 29 import org.alfresco.service.cmr.repository.Path; 30 import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; 31 import org.alfresco.service.cmr.repository.datatype.TypeConversionException; 32 import org.alfresco.service.cmr.repository.datatype.TypeConverter; 33 import org.alfresco.service.namespace.NamespaceException; 34 import org.alfresco.service.namespace.QName; 35 36 37 43 public class JCRTypeConverter 44 { 45 private SessionTypeConverter jcrTypeConverter; 46 47 52 public JCRTypeConverter(SessionImpl session) 53 { 54 this.jcrTypeConverter = new SessionTypeConverter(session); 55 } 56 57 62 public TypeConverter getConverter() 63 { 64 return jcrTypeConverter; 65 } 66 67 68 77 public NodeImpl referenceValue(Object value) throws ValueFormatException, RepositoryException 78 { 79 NodeRef nodeRef = (NodeRef)convert(NodeRef.class, value); 80 return new NodeImpl(jcrTypeConverter.getSession(), nodeRef); 81 } 82 83 91 public String stringValue(Object value) throws ValueFormatException, RepositoryException 92 { 93 return (String )convert(String .class, value); 94 } 95 96 104 public InputStream streamValue(Object value) throws IllegalStateException , RepositoryException 105 { 106 return (InputStream )convert(InputStream .class, value); 107 } 108 109 118 public long longValue(Object value) throws ValueFormatException, IllegalStateException , RepositoryException 119 { 120 try 121 { 122 return jcrTypeConverter.longValue(value); 123 } 124 catch(Exception e) 125 { 126 translateException(e); 127 throw new RepositoryException(e); 128 } 129 } 130 131 140 public double doubleValue(Object value) throws ValueFormatException, IllegalStateException , RepositoryException 141 { 142 try 143 { 144 return jcrTypeConverter.doubleValue(value); 145 } 146 catch(Exception e) 147 { 148 translateException(e); 149 throw new RepositoryException(e); 150 } 151 } 152 153 162 public Calendar dateValue(Object value) throws ValueFormatException, IllegalStateException , RepositoryException 163 { 164 Date date = (Date )convert(Date .class, value); 165 Calendar calendar = Calendar.getInstance(); 166 calendar.setTime(date); 167 return calendar; 168 } 169 170 179 public boolean booleanValue(Object value) throws ValueFormatException, IllegalStateException , RepositoryException 180 { 181 try 182 { 183 return jcrTypeConverter.booleanValue(value); 184 } 185 catch(Exception e) 186 { 187 translateException(e); 188 throw new RepositoryException(e); 189 } 190 } 191 192 201 public QName nameValue(Object value) throws ValueFormatException, IllegalStateException , RepositoryException 202 { 203 return convert(QName.class, value); 204 } 205 206 215 public Path pathValue(Object value) throws ValueFormatException, IllegalStateException , RepositoryException 216 { 217 return convert(Path.class, value); 218 } 219 220 221 229 public final Object convert(DataTypeDefinition propertyType, Object value) 230 throws RepositoryException 231 { 232 try 233 { 234 return jcrTypeConverter.convert(propertyType, value); 235 } 236 catch(Exception e) 237 { 238 translateException(e); 239 throw new RepositoryException(e); 240 } 241 } 242 243 252 public final <T> T convert(Class <T> c, Object value) 253 throws RepositoryException 254 { 255 try 256 { 257 return jcrTypeConverter.convert(c, value); 258 } 259 catch(Exception e) 260 { 261 translateException(e); 262 throw new RepositoryException(e); 263 } 264 } 265 266 272 private static void translateException(Exception e) throws ValueFormatException 273 { 274 if (e instanceof TypeConversionException || 275 e instanceof NumberFormatException ) 276 { 277 throw new ValueFormatException(e); 278 } 279 } 280 281 282 287 private static class SessionTypeConverter extends TypeConverter 288 { 289 private SessionImpl session; 290 291 296 public SessionTypeConverter(SessionImpl session) 297 { 298 this.session = session; 299 300 301 304 addConverter(String .class, QName.class, new TypeConverter.Converter<String , QName>() 305 { 306 public QName convert(String source) 307 { 308 try 309 { 310 return QName.createQName(source, SessionTypeConverter.this.session.getNamespaceResolver()); 311 } 312 catch(NamespaceException e) 313 { 314 throw new TypeConversionException("Cannot convert " + source + " to qualified name", e); 315 } 316 } 317 }); 318 319 322 addConverter(String .class, Path.class, new TypeConverter.Converter<String , Path>() 323 { 324 public Path convert(String source) 325 { 326 try 327 { 328 return new JCRPath(SessionTypeConverter.this.session.getNamespaceResolver(), source).getPath(); 329 } 330 catch(NamespaceException e) 331 { 332 throw new TypeConversionException("Cannot convert " + source + " to qualified name", e); 333 } 334 } 335 }); 336 337 340 addConverter(QName.class, String .class, new TypeConverter.Converter<QName, String >() 341 { 342 public String convert(QName source) 343 { 344 try 345 { 346 return source.toPrefixString(SessionTypeConverter.this.session.getNamespaceResolver()); 347 } 348 catch(NamespaceException e) 349 { 350 throw new TypeConversionException("Cannot convert " + source + " to qualified name", e); 351 } 352 } 353 }); 354 355 358 addConverter(Path.class, String .class, new TypeConverter.Converter<Path, String >() 359 { 360 public String convert(Path source) 361 { 362 try 363 { 364 return source.toPrefixString(SessionTypeConverter.this.session.getNamespaceResolver()); 365 } 366 catch(NamespaceException e) 367 { 368 throw new TypeConversionException("Cannot convert " + source + " to qualified name", e); 369 } 370 } 371 }); 372 373 376 addConverter(NodeRef.class, String .class, new TypeConverter.Converter<NodeRef, String >() 377 { 378 public String convert(NodeRef source) 379 { 380 return source.getId(); 381 } 382 }); 383 } 384 385 390 public SessionImpl getSession() 391 { 392 return session; 393 } 394 395 398 @Override  399 @SuppressWarnings ("unchecked") 400 public <F, T> Converter getConverter(Class <F> source, Class <T> dest) 401 { 402 Converter converter = super.getConverter(source, dest); 403 if (converter == null) 404 { 405 converter = DefaultTypeConverter.INSTANCE.getConverter(source, dest); 406 if (converter instanceof DynamicTwoStageConverter) 407 { 408 DynamicTwoStageConverter dynamic = (DynamicTwoStageConverter)converter; 409 converter = addDynamicTwoStageConverter(dynamic.getFrom(), dynamic.getIntermediate(), dynamic.getTo()); 410 } 411 } 412 return converter; 413 } 414 } 415 416 } 417 | Popular Tags |