/*
* Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
package com.sun.javafx.css;
import com.sun.javafx.scene.layout.region.CornerRadiiConverter;
import com.sun.javafx.util.Logging;
import javafx.css.CssMetaData;
import javafx.css.ParsedValue;
import javafx.css.StyleConverter;
import javafx.css.Styleable;
import sun.util.logging.PlatformLogger;
import sun.util.logging.PlatformLogger.Level;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;
/**
* Converter converts ParsedValueImpl<F,T> from type F to type T.
* F is the type of the parsed value, T is the converted type of
* the ParsedValueImpl. For example, a converter from String to Color would
* be declared
*
* public Color convert(ParsedValueImpl<String,Color> value, Font font)
*
*/
public class StyleConverterImpl extends StyleConverter {
/**
* Convert from the constituent values to the target property type.
* Implemented by Types that have Keys with subKeys.
*/
public T convert(Map,Object> convertedValues) {
return null;
}
protected StyleConverterImpl() {
super();
}
public void writeBinary(DataOutputStream os, StringStore sstore)
throws IOException {
String cname = getClass().getName();
int index = sstore.addString(cname);
os.writeShort(index);
}
private static Map cache;
static void clearCache() { if (cache != null) cache.clear(); }
protected T getCachedValue(ParsedValue key) {
if (cache != null) {
return (T)cache.get(key);
}
return null;
}
protected void cacheValue(ParsedValue key, Object value) {
if (cache == null) cache = new WeakHashMap<>();
cache.put(key, value);
}
// map of StyleConverter class name to StyleConverter
private static Map> tmap;
@SuppressWarnings("rawtypes")
public static StyleConverter,?> readBinary(DataInputStream is, String[] strings)
throws IOException {
int index = is.readShort();
String cname = strings[index];
if (cname == null || cname.isEmpty()) return null;
if (cname.startsWith("com.sun.javafx.css.converters.EnumConverter")) {
return (StyleConverter)com.sun.javafx.css.converters.EnumConverter.readBinary(is, strings);
}
// Make a new entry in tmap, if necessary
if (tmap == null || !tmap.containsKey(cname)) {
StyleConverter,?> converter = getInstance(cname);
if (converter == null) {
final PlatformLogger logger = Logging.getCSSLogger();
if (logger.isLoggable(Level.SEVERE)) {
logger.severe("could not deserialize " + cname);
}
}
if (converter == null) {
System.err.println("could not deserialize " + cname);
}
if (tmap == null) tmap = new HashMap>();
tmap.put(cname, converter);
return converter;
}
return tmap.get(cname);
}
// package for unit test purposes
static StyleConverter,?> getInstance(final String converterClass) {
StyleConverter,?> styleConverter = null;
switch(converterClass) {
case "com.sun.javafx.css.converters.BooleanConverter" :
styleConverter = com.sun.javafx.css.converters.BooleanConverter.getInstance();
break;
case "com.sun.javafx.css.converters.ColorConverter" :
styleConverter = com.sun.javafx.css.converters.ColorConverter.getInstance();
break;
case "com.sun.javafx.css.converters.CursorConverter" :
styleConverter = com.sun.javafx.css.converters.CursorConverter.getInstance();
break;
case "com.sun.javafx.css.converters.EffectConverter" :
styleConverter = com.sun.javafx.css.converters.EffectConverter.getInstance();
break;
case "com.sun.javafx.css.converters.EffectConverter$DropShadowConverter" :
styleConverter = com.sun.javafx.css.converters.EffectConverter.DropShadowConverter.getInstance();
break;
case "com.sun.javafx.css.converters.EffectConverter$InnerShadowConverter" :
styleConverter = com.sun.javafx.css.converters.EffectConverter.InnerShadowConverter.getInstance();
break;
case "com.sun.javafx.css.converters.FontConverter" :
styleConverter = com.sun.javafx.css.converters.FontConverter.getInstance();
break;
case "com.sun.javafx.css.converters.FontConverter$FontStyleConverter" :
case "com.sun.javafx.css.converters.FontConverter$StyleConverter" :
styleConverter = com.sun.javafx.css.converters.FontConverter.FontStyleConverter.getInstance();
break;
case "com.sun.javafx.css.converters.FontConverter$FontWeightConverter" :
case "com.sun.javafx.css.converters.FontConverter$WeightConverter" :
styleConverter = com.sun.javafx.css.converters.FontConverter.FontWeightConverter.getInstance();
break;
case "com.sun.javafx.css.converters.FontConverter$FontSizeConverter" :
case "com.sun.javafx.css.converters.FontConverter$SizeConverter" :
styleConverter = com.sun.javafx.css.converters.FontConverter.FontSizeConverter.getInstance();
break;
case "com.sun.javafx.css.converters.InsetsConverter" :
styleConverter = com.sun.javafx.css.converters.InsetsConverter.getInstance();
break;
case "com.sun.javafx.css.converters.InsetsConverter$SequenceConverter" :
styleConverter = com.sun.javafx.css.converters.InsetsConverter.SequenceConverter.getInstance();
break;
case "com.sun.javafx.css.converters.PaintConverter" :
styleConverter = com.sun.javafx.css.converters.PaintConverter.getInstance();
break;
case "com.sun.javafx.css.converters.PaintConverter$SequenceConverter" :
styleConverter = com.sun.javafx.css.converters.PaintConverter.SequenceConverter.getInstance();
break;
case "com.sun.javafx.css.converters.PaintConverter$LinearGradientConverter" :
styleConverter = com.sun.javafx.css.converters.PaintConverter.LinearGradientConverter.getInstance();
break;
case "com.sun.javafx.css.converters.PaintConverter$RadialGradientConverter" :
styleConverter = com.sun.javafx.css.converters.PaintConverter.RadialGradientConverter.getInstance();
break;
case "com.sun.javafx.css.converters.SizeConverter" :
styleConverter = com.sun.javafx.css.converters.SizeConverter.getInstance();
break;
case "com.sun.javafx.css.converters.SizeConverter$SequenceConverter" :
styleConverter = com.sun.javafx.css.converters.SizeConverter.SequenceConverter.getInstance();
break;
case "com.sun.javafx.css.converters.StringConverter" :
styleConverter = com.sun.javafx.css.converters.StringConverter.getInstance();
break;
case "com.sun.javafx.css.converters.StringConverter$SequenceConverter" :
styleConverter = com.sun.javafx.css.converters.StringConverter.SequenceConverter.getInstance();
break;
case "com.sun.javafx.css.converters.URLConverter" :
styleConverter = com.sun.javafx.css.converters.URLConverter.getInstance();
break;
case "com.sun.javafx.css.converters.URLConverter$SequenceConverter" :
styleConverter = com.sun.javafx.css.converters.URLConverter.SequenceConverter.getInstance();
break;
// Region stuff - including 2.x class names
case "com.sun.javafx.scene.layout.region.BackgroundPositionConverter" :
case "com.sun.javafx.scene.layout.region.BackgroundImage$BackgroundPositionConverter" :
styleConverter = com.sun.javafx.scene.layout.region.BackgroundPositionConverter.getInstance();
break;
case "com.sun.javafx.scene.layout.region.BackgroundSizeConverter" :
case "com.sun.javafx.scene.layout.region.BackgroundImage$BackgroundSizeConverter" :
styleConverter = com.sun.javafx.scene.layout.region.BackgroundSizeConverter.getInstance();
break;
case "com.sun.javafx.scene.layout.region.BorderImageSliceConverter" :
case "com.sun.javafx.scene.layout.region.BorderImage$SliceConverter" :
styleConverter = com.sun.javafx.scene.layout.region.BorderImageSliceConverter.getInstance();
break;
case "com.sun.javafx.scene.layout.region.BorderImageWidthConverter" :
styleConverter = com.sun.javafx.scene.layout.region.BorderImageWidthConverter.getInstance();
break;
case "com.sun.javafx.scene.layout.region.BorderImageWidthsSequenceConverter" :
styleConverter = com.sun.javafx.scene.layout.region.BorderImageWidthsSequenceConverter.getInstance();
break;
case "com.sun.javafx.scene.layout.region.BorderStrokeStyleSequenceConverter" :
case "com.sun.javafx.scene.layout.region.StrokeBorder$BorderStyleSequenceConverter" :
styleConverter = com.sun.javafx.scene.layout.region.BorderStrokeStyleSequenceConverter.getInstance();
break;
case "com.sun.javafx.scene.layout.region.BorderStyleConverter" :
case "com.sun.javafx.scene.layout.region.StrokeBorder$BorderStyleConverter" :
styleConverter = com.sun.javafx.scene.layout.region.BorderStyleConverter.getInstance();
break;
case "com.sun.javafx.scene.layout.region.LayeredBackgroundPositionConverter" :
case "com.sun.javafx.scene.layout.region.BackgroundImage$LayeredBackgroundPositionConverter" :
styleConverter = com.sun.javafx.scene.layout.region.LayeredBackgroundPositionConverter.getInstance();
break;
case "com.sun.javafx.scene.layout.region.LayeredBackgroundSizeConverter" :
case "com.sun.javafx.scene.layout.region.BackgroundImage$LayeredBackgroundSizeConverter" :
styleConverter = com.sun.javafx.scene.layout.region.LayeredBackgroundSizeConverter.getInstance();
break;
case "com.sun.javafx.scene.layout.region.LayeredBorderPaintConverter" :
case "com.sun.javafx.scene.layout.region.StrokeBorder$LayeredBorderPaintConverter" :
styleConverter = com.sun.javafx.scene.layout.region.LayeredBorderPaintConverter.getInstance();
break;
case "com.sun.javafx.scene.layout.region.LayeredBorderStyleConverter" :
case "com.sun.javafx.scene.layout.region.StrokeBorder$LayeredBorderStyleConverter" :
styleConverter = com.sun.javafx.scene.layout.region.LayeredBorderStyleConverter.getInstance();
break;
case "com.sun.javafx.scene.layout.region.RepeatStructConverter" :
case "com.sun.javafx.scene.layout.region.BackgroundImage$BackgroundRepeatConverter" :
case "com.sun.javafx.scene.layout.region.BorderImage$RepeatConverter" :
styleConverter = com.sun.javafx.scene.layout.region.RepeatStructConverter.getInstance();
break;
case "com.sun.javafx.scene.layout.region.SliceSequenceConverter" :
case "com.sun.javafx.scene.layout.region.BorderImage$SliceSequenceConverter" :
styleConverter = com.sun.javafx.scene.layout.region.SliceSequenceConverter.getInstance();
break;
case "com.sun.javafx.scene.layout.region.StrokeBorderPaintConverter" :
case "com.sun.javafx.scene.layout.region.StrokeBorder$BorderPaintConverter" :
styleConverter = com.sun.javafx.scene.layout.region.StrokeBorderPaintConverter.getInstance();
break;
case "com.sun.javafx.scene.layout.region.Margins$Converter" :
styleConverter = com.sun.javafx.scene.layout.region.Margins.Converter.getInstance();
break;
case "com.sun.javafx.scene.layout.region.Margins$SequenceConverter" :
styleConverter = com.sun.javafx.scene.layout.region.Margins.SequenceConverter.getInstance();
break;
case "javafx.scene.layout.CornerRadiiConverter" : // Fix for RT-39665
case "com.sun.javafx.scene.layout.region.CornerRadiiConverter" :
styleConverter = CornerRadiiConverter.getInstance();
break;
// parser stuff
case "com.sun.javafx.css.parser.DeriveColorConverter" :
styleConverter = com.sun.javafx.css.parser.DeriveColorConverter.getInstance();
break;
case "com.sun.javafx.css.parser.DeriveSizeConverter" :
styleConverter = com.sun.javafx.css.parser.DeriveSizeConverter.getInstance();
break;
case "com.sun.javafx.css.parser.LadderConverter" :
styleConverter = com.sun.javafx.css.parser.LadderConverter.getInstance();
break;
case "com.sun.javafx.css.parser.StopConverter" :
styleConverter = com.sun.javafx.css.parser.StopConverter.getInstance();
break;
default :
final PlatformLogger logger = Logging.getCSSLogger();
if (logger.isLoggable(Level.SEVERE)) {
logger.severe("StyleConverterImpl : converter Class is null for : "+converterClass);
}
break;
}
return styleConverter;
}
}