package comeon.core.mediareaders; import comeon.core.Core; import comeon.core.MediaUploadBatch; import comeon.model.Media; import comeon.model.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.swing.*; import java.io.File; import java.io.IOException; import java.util.Optional; abstract class AbstractMediaReader implements MediaReader { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractMediaReader.class); private final File file; private final User user; AbstractMediaReader(final File file, final User user) { this.file = file; this.user = user; } protected final File getFile() { return file; } @Override public final Optional<Media> readMedia(final MediaUploadBatch context) { final String fileName = file.getAbsolutePath(); try { final Media media = buildMedia(context); media.getMetadata().put(Core.EXTERNAL_METADATA_KEY, context.getExternalMetadata(media, media.getMetadata())); media.renderTemplate(user); media.addPropertyChangeListener(evt -> { if ("templateText".equals(evt.getPropertyName())) { new TemplateRenderer(media).execute(); } }); return Optional.of(media); } catch (final MediaReaderException e) { LOGGER.warn("Can't read metadata from {}", fileName, e); return Optional.empty(); } catch (final IOException e) { LOGGER.warn("Can't read file {}", fileName, e); return Optional.empty(); } } protected abstract Media buildMedia(final MediaUploadBatch context) throws MediaReaderException, IOException; private class TemplateRenderer extends SwingWorker<Void, Void> { private final Media media; TemplateRenderer(final Media media) { this.media = media; } @Override protected Void doInBackground() throws Exception { media.renderTemplate(user); return null; } } }