// Path: fx-inject-examples/addressbook-app/src/main/java/com/cathive/fx/apps/contacts/model/converter/ImageConverter.java
// @Converter
// public class ImageConverter implements AttributeConverter<Image, byte[]> {
// 
//     /** Logger for this instance. */
//     private static final Logger LOGGER = Logger.getLogger(ImageConverter.class.getName());
// 
//     @Override
//     public byte[] convertToDatabaseColumn(final Image image) {
//         byte[] bytes;
//         try (final ByteArrayOutputStream baos = new ByteArrayOutputStream(1024)) {
//             ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png", baos);
//             bytes = baos.toByteArray();
//         } catch (final IOException e) {
//             LOGGER.log(Level.WARNING, "Couldn't convert image to byte array");
//             bytes = null;
//         }
//         return bytes;
//     }
// 
//     @Override
//     public Image convertToEntityAttribute(final byte[] bytes) {
//         Image img;
//         try (final ByteArrayInputStream bis = new ByteArrayInputStream(bytes)) {
//             img = new Image(bis);
//         } catch (final IOException e) {
//             LOGGER.log(Level.WARNING, "Couldn't create image from byte array.");
//             img = null;
//         }
//         return img;
//     }
// 
// }


import com.cathive.fx.apps.contacts.model.converter.ImageConverter;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.scene.image.Image;
import javax.persistence.*;
import java.io.Serializable;
/*
 * Copyright (C) 2013,2014 The Cat Hive Developers.
 *
 * 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 com.cathive.fx.apps.contacts.model;



/**
 * @author Benjamin P. Jung
 */
@Entity
@Table(name = "contact")
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.CHAR)
@DiscriminatorValue(value = "?")
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Contact extends AbstractEntity
                              implements Serializable {

    /** @see java.io.Serializable */
    private static final long serialVersionUID = 1L;

    // <editor-fold desc="Property: photo">
    public static final String PHOTO_PROPERTY = "photo";
    private final ObjectProperty<Image> photo = new SimpleObjectProperty<>(this, PHOTO_PROPERTY);
    public ObjectProperty<Image> photoProperty() {
        return this.photo;
    }
    @Column(name = "photo_data")
// Path: fx-inject-examples/addressbook-app/src/main/java/com/cathive/fx/apps/contacts/model/converter/ImageConverter.java
// @Converter
// public class ImageConverter implements AttributeConverter<Image, byte[]> {
// 
//     /** Logger for this instance. */
//     private static final Logger LOGGER = Logger.getLogger(ImageConverter.class.getName());
// 
//     @Override
//     public byte[] convertToDatabaseColumn(final Image image) {
//         byte[] bytes;
//         try (final ByteArrayOutputStream baos = new ByteArrayOutputStream(1024)) {
//             ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png", baos);
//             bytes = baos.toByteArray();
//         } catch (final IOException e) {
//             LOGGER.log(Level.WARNING, "Couldn't convert image to byte array");
//             bytes = null;
//         }
//         return bytes;
//     }
// 
//     @Override
//     public Image convertToEntityAttribute(final byte[] bytes) {
//         Image img;
//         try (final ByteArrayInputStream bis = new ByteArrayInputStream(bytes)) {
//             img = new Image(bis);
//         } catch (final IOException e) {
//             LOGGER.log(Level.WARNING, "Couldn't create image from byte array.");
//             img = null;
//         }
//         return img;
//     }
// 
// }


// Path: fx-inject-examples/addressbook-app/src/main/java/com/cathive/fx/apps/contacts/model/Contact.java
import com.cathive.fx.apps.contacts.model.converter.ImageConverter;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.scene.image.Image;
import javax.persistence.*;
import java.io.Serializable;

/*
 * Copyright (C) 2013,2014 The Cat Hive Developers.
 *
 * 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 com.cathive.fx.apps.contacts.model;



/**
 * @author Benjamin P. Jung
 */
@Entity
@Table(name = "contact")
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.CHAR)
@DiscriminatorValue(value = "?")
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Contact extends AbstractEntity
                              implements Serializable {

    /** @see java.io.Serializable */
    private static final long serialVersionUID = 1L;

    // <editor-fold desc="Property: photo">
    public static final String PHOTO_PROPERTY = "photo";
    private final ObjectProperty<Image> photo = new SimpleObjectProperty<>(this, PHOTO_PROPERTY);
    public ObjectProperty<Image> photoProperty() {
        return this.photo;
    }
    @Column(name = "photo_data")
    @Convert(converter = ImageConverter.class)