Remove edit, cleanup, rename
This commit is contained in:
		
							parent
							
								
									4005e3d702
								
							
						
					
					
						commit
						3b2305949c
					
				
							
								
								
									
										8
									
								
								.idea/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.idea/.gitignore
									
									
									
									
										vendored
									
									
								
							@ -1,8 +0,0 @@
 | 
				
			|||||||
# Default ignored files
 | 
					 | 
				
			||||||
/shelf/
 | 
					 | 
				
			||||||
/workspace.xml
 | 
					 | 
				
			||||||
# Editor-based HTTP Client requests
 | 
					 | 
				
			||||||
/httpRequests/
 | 
					 | 
				
			||||||
# Datasource local storage ignored files
 | 
					 | 
				
			||||||
/dataSources/
 | 
					 | 
				
			||||||
/dataSources.local.xml
 | 
					 | 
				
			||||||
@ -1,20 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<project version="4">
 | 
					 | 
				
			||||||
  <component name="RemoteRepositoriesConfiguration">
 | 
					 | 
				
			||||||
    <remote-repository>
 | 
					 | 
				
			||||||
      <option name="id" value="central" />
 | 
					 | 
				
			||||||
      <option name="name" value="Maven Central repository" />
 | 
					 | 
				
			||||||
      <option name="url" value="https://repo1.maven.org/maven2" />
 | 
					 | 
				
			||||||
    </remote-repository>
 | 
					 | 
				
			||||||
    <remote-repository>
 | 
					 | 
				
			||||||
      <option name="id" value="jboss.community" />
 | 
					 | 
				
			||||||
      <option name="name" value="JBoss Community repository" />
 | 
					 | 
				
			||||||
      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
 | 
					 | 
				
			||||||
    </remote-repository>
 | 
					 | 
				
			||||||
    <remote-repository>
 | 
					 | 
				
			||||||
      <option name="id" value="MavenRepo" />
 | 
					 | 
				
			||||||
      <option name="name" value="MavenRepo" />
 | 
					 | 
				
			||||||
      <option name="url" value="https://repo.maven.apache.org/maven2/" />
 | 
					 | 
				
			||||||
    </remote-repository>
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
</project>
 | 
					 | 
				
			||||||
@ -4,7 +4,5 @@
 | 
				
			|||||||
  <component name="FrameworkDetectionExcludesConfiguration">
 | 
					  <component name="FrameworkDetectionExcludesConfiguration">
 | 
				
			||||||
    <file type="web" url="file://$PROJECT_DIR$" />
 | 
					    <file type="web" url="file://$PROJECT_DIR$" />
 | 
				
			||||||
  </component>
 | 
					  </component>
 | 
				
			||||||
  <component name="ProjectRootManager" version="2" languageLevel="JDK_18" default="true" project-jdk-name="temurin-18" project-jdk-type="JavaSDK">
 | 
					  <component name="ProjectRootManager" version="2" languageLevel="JDK_18" project-jdk-name="temurin-18" project-jdk-type="JavaSDK" />
 | 
				
			||||||
    <output url="file://$PROJECT_DIR$/out" />
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
</project>
 | 
					</project>
 | 
				
			||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
<project version="4">
 | 
					<project version="4">
 | 
				
			||||||
  <component name="VcsDirectoryMappings">
 | 
					  <component name="VcsDirectoryMappings">
 | 
				
			||||||
    <mapping directory="$PROJECT_DIR$" vcs="Git" />
 | 
					    <mapping directory="" vcs="Git" />
 | 
				
			||||||
  </component>
 | 
					  </component>
 | 
				
			||||||
</project>
 | 
					</project>
 | 
				
			||||||
@ -1,3 +1,3 @@
 | 
				
			|||||||
# VCardGenerator
 | 
					# Signature Card Generator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Worky thingy
 | 
					Worky thingy
 | 
				
			||||||
@ -3,8 +3,8 @@ plugins {
 | 
				
			|||||||
    id 'com.github.johnrengelman.shadow' version '5.2.0'
 | 
					    id 'com.github.johnrengelman.shadow' version '5.2.0'
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
group 'tech.nevets.vcardgen'
 | 
					group 'tech.nevets'
 | 
				
			||||||
version '1.1'
 | 
					version '2.0.0'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
repositories {
 | 
					repositories {
 | 
				
			||||||
    mavenCentral()
 | 
					    mavenCentral()
 | 
				
			||||||
@ -20,7 +20,7 @@ dependencies {
 | 
				
			|||||||
jar {
 | 
					jar {
 | 
				
			||||||
    manifest {
 | 
					    manifest {
 | 
				
			||||||
        attributes(
 | 
					        attributes(
 | 
				
			||||||
                'Main-Class': 'tech.nevets.vcardgen.Main'
 | 
					                'Main-Class': 'tech.nevets.signaturecardgen.Main'
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -1,2 +1,2 @@
 | 
				
			|||||||
rootProject.name = 'VCardGenerator'
 | 
					rootProject.name = 'SignatureCardGenerator'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,18 +1,13 @@
 | 
				
			|||||||
package tech.nevets.vcardgen;
 | 
					package tech.nevets.signaturecardgen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.google.gson.Gson;
 | 
					 | 
				
			||||||
import com.google.gson.JsonObject;
 | 
					import com.google.gson.JsonObject;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import javax.imageio.*;
 | 
					import javax.imageio.*;
 | 
				
			||||||
import javax.imageio.metadata.IIOMetadata;
 | 
					 | 
				
			||||||
import javax.imageio.metadata.IIOMetadataNode;
 | 
					 | 
				
			||||||
import javax.imageio.stream.ImageOutputStream;
 | 
					 | 
				
			||||||
import java.awt.*;
 | 
					import java.awt.*;
 | 
				
			||||||
import java.awt.image.BufferedImage;
 | 
					import java.awt.image.BufferedImage;
 | 
				
			||||||
import java.io.*;
 | 
					import java.io.*;
 | 
				
			||||||
import java.util.*;
 | 
					import java.util.*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//TODO Clear layer when new data is written...
 | 
					 | 
				
			||||||
public class Card {
 | 
					public class Card {
 | 
				
			||||||
    public static final Map<String, Card> CARD_SESSIONS = new HashMap<>();
 | 
					    public static final Map<String, Card> CARD_SESSIONS = new HashMap<>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -30,18 +25,17 @@ public class Card {
 | 
				
			|||||||
    private static final Font ARIAL38I = new Font("Arial", Font.ITALIC, 38);
 | 
					    private static final Font ARIAL38I = new Font("Arial", Font.ITALIC, 38);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // ---------------- LAYERS ---------------- //
 | 
					    // ---------------- LAYERS ---------------- //
 | 
				
			||||||
    private BufferedImage background;
 | 
					    private final BufferedImage background;
 | 
				
			||||||
    private BufferedImage nameLayer = new BufferedImage(1080, 602, BufferedImage.TYPE_INT_ARGB);
 | 
					    private final BufferedImage nameLayer = new BufferedImage(1080, 602, BufferedImage.TYPE_INT_ARGB);
 | 
				
			||||||
    private BufferedImage titleLayer = new BufferedImage(1080, 602, BufferedImage.TYPE_INT_ARGB);
 | 
					    private final BufferedImage titleLayer = new BufferedImage(1080, 602, BufferedImage.TYPE_INT_ARGB);
 | 
				
			||||||
    private BufferedImage emailLayer = new BufferedImage(1080, 602, BufferedImage.TYPE_INT_ARGB);
 | 
					    private final BufferedImage emailLayer = new BufferedImage(1080, 602, BufferedImage.TYPE_INT_ARGB);
 | 
				
			||||||
    private BufferedImage locationLayer = new BufferedImage(1080, 602, BufferedImage.TYPE_INT_ARGB);
 | 
					    private final BufferedImage locationLayer = new BufferedImage(1080, 602, BufferedImage.TYPE_INT_ARGB);
 | 
				
			||||||
    private BufferedImage phoneNumbersLayer = new BufferedImage(1080, 602, BufferedImage.TYPE_INT_ARGB);
 | 
					    private final BufferedImage phoneNumbersLayer = new BufferedImage(1080, 602, BufferedImage.TYPE_INT_ARGB);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // ---------------- Working Images ---------------- //
 | 
					    // ---------------- Working Images ---------------- //
 | 
				
			||||||
    private Graphics2D graphics;
 | 
					    private Graphics2D graphics;
 | 
				
			||||||
    private BufferedImage rawImage = new BufferedImage(1080, 602, BufferedImage.TYPE_INT_ARGB);
 | 
					    private final BufferedImage rawImage = new BufferedImage(1080, 602, BufferedImage.TYPE_INT_ARGB);
 | 
				
			||||||
    private BufferedImage workingImage = new BufferedImage(1080, 602, BufferedImage.TYPE_INT_ARGB);
 | 
					    private BufferedImage workingImage = new BufferedImage(1080, 602, BufferedImage.TYPE_INT_ARGB);
 | 
				
			||||||
    private IIOImage finalImage;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // ---------------- DATA ---------------- //
 | 
					    // ---------------- DATA ---------------- //
 | 
				
			||||||
    public final String id;
 | 
					    public final String id;
 | 
				
			||||||
@ -53,14 +47,13 @@ public class Card {
 | 
				
			|||||||
    private String directNumber;
 | 
					    private String directNumber;
 | 
				
			||||||
    private String cellNumber;
 | 
					    private String cellNumber;
 | 
				
			||||||
    private int size;
 | 
					    private int size;
 | 
				
			||||||
    private boolean hasLongAddress;
 | 
					 | 
				
			||||||
    private boolean hasDirectNumber;
 | 
					    private boolean hasDirectNumber;
 | 
				
			||||||
    private boolean hasCellNumber;
 | 
					    private boolean hasCellNumber;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Constructs an empty card.<br>
 | 
					     * Constructs an empty card.<br>
 | 
				
			||||||
     * Calls:<br>{@link tech.nevets.vcardgen.Card#Card(String, String, String, String, String, String, String, int)} with empty strings and full size image
 | 
					     * Calls:<br>{@link tech.nevets.signaturecardgen.Card#Card(String, String, String, String, String, String, String, int)} with empty strings and full size image
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public Card() {
 | 
					    public Card() {
 | 
				
			||||||
        this("", "", "", "", "", "", "", 1);
 | 
					        this("", "", "", "", "", "", "", 1);
 | 
				
			||||||
@ -68,19 +61,19 @@ public class Card {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Constructor that fills out entire Card details.<br>
 | 
					     * Constructor that fills out entire Card details.<br>
 | 
				
			||||||
     * Calls:<br>{@link tech.nevets.vcardgen.Card#Card(String, String, String, String, String, String, String, int)}
 | 
					     * Calls:<br>{@link tech.nevets.signaturecardgen.Card#Card(String, String, String, String, String, String, String, int)}
 | 
				
			||||||
     * @param json Json object from frontend
 | 
					     * @param json Json object from frontend
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public Card(JsonObject json) {
 | 
					    public Card(JsonObject json) {
 | 
				
			||||||
        this(
 | 
					        this(
 | 
				
			||||||
                json.get("name").getAsString(), //name
 | 
					                json.get("name").getAsString(),
 | 
				
			||||||
                json.get("title").getAsString(), //title
 | 
					                json.get("title").getAsString(),
 | 
				
			||||||
                json.get("email").getAsString(), //email
 | 
					                json.get("email").getAsString(),
 | 
				
			||||||
                json.get("locationId").getAsString(), //locationId
 | 
					                json.get("locationId").getAsString(),
 | 
				
			||||||
                json.get("extension").getAsString(), //extension
 | 
					                json.get("extension").getAsString(),
 | 
				
			||||||
                json.get("directNumber").getAsString(), //directNumber
 | 
					                json.get("directNumber").getAsString(),
 | 
				
			||||||
                json.get("cellNumber").getAsString(), //cellNumber
 | 
					                json.get("cellNumber").getAsString(),
 | 
				
			||||||
                json.get("size").getAsInt() //size
 | 
					                json.get("size").getAsInt()
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -90,8 +83,8 @@ public class Card {
 | 
				
			|||||||
     * @param title User's Title
 | 
					     * @param title User's Title
 | 
				
			||||||
     * @param email User's Email
 | 
					     * @param email User's Email
 | 
				
			||||||
     * @param locationId User's Location ID
 | 
					     * @param locationId User's Location ID
 | 
				
			||||||
     * @param extension User's Extension (can be empty <b>if</b> {@link tech.nevets.vcardgen.Card#directNumber} is populated)
 | 
					     * @param extension User's Extension (can be empty <b>if</b> {@link tech.nevets.signaturecardgen.Card#directNumber} is populated)
 | 
				
			||||||
     * @param directNumber User's Direct Number (can be empty <b>if</b> {@link tech.nevets.vcardgen.Card#extension} is populated)
 | 
					     * @param directNumber User's Direct Number (can be empty <b>if</b> {@link tech.nevets.signaturecardgen.Card#extension} is populated)
 | 
				
			||||||
     * @param cellNumber User's Cell Phone Number (can be empty)
 | 
					     * @param cellNumber User's Cell Phone Number (can be empty)
 | 
				
			||||||
     * @param size Size to set the Card to (0 for Outlook 2016 size, 1 for full size)
 | 
					     * @param size Size to set the Card to (0 for Outlook 2016 size, 1 for full size)
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
@ -144,21 +137,31 @@ public class Card {
 | 
				
			|||||||
        hasCellNumber = cellNumber.length() > 0;
 | 
					        hasCellNumber = cellNumber.length() > 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void setSize(int size) {
 | 
				
			||||||
 | 
					        this.size = size;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public BufferedImage getBackground() {
 | 
					    public BufferedImage getBackground() {
 | 
				
			||||||
        return background;
 | 
					        return background;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private BufferedImage renderLayer(BufferedImage layer, String content, Color textColor, Font font, int x, int y) {
 | 
					    private void clearLayer(BufferedImage layer) {
 | 
				
			||||||
 | 
					        Graphics2D g = layer.createGraphics();
 | 
				
			||||||
 | 
					        g.setComposite(AlphaComposite.Clear);
 | 
				
			||||||
 | 
					        g.fillRect(0, 0, 1080, 602);
 | 
				
			||||||
 | 
					        g.dispose();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private void renderLayer(BufferedImage layer, String content, Color textColor, Font font, int x, int y) {
 | 
				
			||||||
        graphics = layer.createGraphics();
 | 
					        graphics = layer.createGraphics();
 | 
				
			||||||
        setAntiAlias(graphics);
 | 
					        setAntiAlias(graphics);
 | 
				
			||||||
        graphics.setColor(textColor);
 | 
					        graphics.setColor(textColor);
 | 
				
			||||||
        graphics.setFont(font);
 | 
					        graphics.setFont(font);
 | 
				
			||||||
        graphics.drawString(content, x, y);
 | 
					        graphics.drawString(content, x, y);
 | 
				
			||||||
        graphics.dispose();
 | 
					        graphics.dispose();
 | 
				
			||||||
        return layer;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private BufferedImage renderResizableLayer(BufferedImage layer, String content, Color textColor, int maxLength, Font defaultFont, Font smallFont, int x, int y) {
 | 
					    private void renderResizableLayer(BufferedImage layer, String content, Color textColor, int maxLength, Font defaultFont, Font smallFont, int x, int y) {
 | 
				
			||||||
        graphics = layer.createGraphics();
 | 
					        graphics = layer.createGraphics();
 | 
				
			||||||
        setAntiAlias(graphics);
 | 
					        setAntiAlias(graphics);
 | 
				
			||||||
        graphics.setColor(textColor);
 | 
					        graphics.setColor(textColor);
 | 
				
			||||||
@ -166,19 +169,24 @@ public class Card {
 | 
				
			|||||||
        else graphics.setFont(smallFont);
 | 
					        else graphics.setFont(smallFont);
 | 
				
			||||||
        graphics.drawString(content, x, y);
 | 
					        graphics.drawString(content, x, y);
 | 
				
			||||||
        graphics.dispose();
 | 
					        graphics.dispose();
 | 
				
			||||||
        return layer;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public BufferedImage renderNameLayer() {
 | 
					    public BufferedImage renderNameLayer() {
 | 
				
			||||||
        return renderResizableLayer(nameLayer, name, WHITE, 970, ARIAL65, ARIAL55, 85, 112);
 | 
					        clearLayer(nameLayer);
 | 
				
			||||||
 | 
					        renderResizableLayer(nameLayer, name, WHITE, 970, ARIAL65, ARIAL55, 85, 112);
 | 
				
			||||||
 | 
					        return nameLayer;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public BufferedImage renderTitleLayer() {
 | 
					    public BufferedImage renderTitleLayer() {
 | 
				
			||||||
        return renderResizableLayer(titleLayer, title, WHITE, 970, ARIAL45I, ARIAL40I, 89, 176);
 | 
					        clearLayer(titleLayer);
 | 
				
			||||||
 | 
					        renderResizableLayer(titleLayer, title, WHITE, 970, ARIAL45I, ARIAL40I, 89, 176);
 | 
				
			||||||
 | 
					        return titleLayer;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public BufferedImage renderEmailLayer() {
 | 
					    public BufferedImage renderEmailLayer() {
 | 
				
			||||||
        return renderLayer(emailLayer, email, WHITE, ARIAL45, 62, (380 - getOffsets(0)));
 | 
					        clearLayer(emailLayer);
 | 
				
			||||||
 | 
					        renderLayer(emailLayer, email, WHITE, ARIAL45, 62, (380 + getOffsets(0)));
 | 
				
			||||||
 | 
					        return emailLayer;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public BufferedImage renderLocationLayer() {
 | 
					    public BufferedImage renderLocationLayer() {
 | 
				
			||||||
@ -203,15 +211,18 @@ public class Card {
 | 
				
			|||||||
            sb.insert(newLineIndex - 2, "\n");
 | 
					            sb.insert(newLineIndex - 2, "\n");
 | 
				
			||||||
            sb.deleteCharAt(sb.length() - 1);
 | 
					            sb.deleteCharAt(sb.length() - 1);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        renderLayer(locationLayer, location.getName(), GREEN, ARIAL44I, 59, (447 - getOffsets(0)));
 | 
					        clearLayer(locationLayer);
 | 
				
			||||||
        return renderLayer(locationLayer, sb.toString(), GREEN, ARIAL38I, 59, (491 - getOffsets(0)));
 | 
					        renderLayer(locationLayer, location.getName(), GREEN, ARIAL44I, 59, (447 + getOffsets(0)));
 | 
				
			||||||
 | 
					        renderLayer(locationLayer, sb.toString(), GREEN, ARIAL38I, 59, (491 + getOffsets(0)));
 | 
				
			||||||
 | 
					        return locationLayer;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public BufferedImage renderPhoneNumbersLayer() {
 | 
					    public BufferedImage renderPhoneNumbersLayer() {
 | 
				
			||||||
 | 
					        clearLayer(phoneNumbersLayer);
 | 
				
			||||||
        if (hasDirectNumber) {
 | 
					        if (hasDirectNumber) {
 | 
				
			||||||
            renderLayer(phoneNumbersLayer, ("W: " + directNumber), GREEN, ARIAL38I, 59, (540 - getOffsets(1)));
 | 
					            renderLayer(phoneNumbersLayer, ("W: " + directNumber), GREEN, ARIAL38I, 59, (540 + getOffsets(1)));
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            renderLayer(phoneNumbersLayer, ("W: " + location.getNumber() + " x" + extension), GREEN, ARIAL38I, 59, (540 - getOffsets(1)));
 | 
					            renderLayer(phoneNumbersLayer, ("W: " + location.getNumber() + " x" + extension), GREEN, ARIAL38I, 59, (540 + getOffsets(1)));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (hasCellNumber) {
 | 
					        if (hasCellNumber) {
 | 
				
			||||||
            renderLayer(phoneNumbersLayer, ("C: " + cellNumber), GREEN, ARIAL38I, 59, 540);
 | 
					            renderLayer(phoneNumbersLayer, ("C: " + cellNumber), GREEN, ARIAL38I, 59, 540);
 | 
				
			||||||
@ -220,15 +231,15 @@ public class Card {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void renderImage() {
 | 
					    public void renderImage() {
 | 
				
			||||||
 | 
					        clearLayer(rawImage);
 | 
				
			||||||
        graphics = rawImage.createGraphics();
 | 
					        graphics = rawImage.createGraphics();
 | 
				
			||||||
        setAntiAlias(graphics);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        graphics.drawImage(background, 0, 0, null);
 | 
					        graphics.drawImage(background, 0, 0, null);
 | 
				
			||||||
        graphics.drawImage(renderNameLayer(), 0, 0, null);
 | 
					        graphics.drawImage(nameLayer, 0, 0, null);
 | 
				
			||||||
        graphics.drawImage(renderTitleLayer(), 0, 0, null);
 | 
					        graphics.drawImage(titleLayer, 0, 0, null);
 | 
				
			||||||
        graphics.drawImage(renderEmailLayer(), 0, 0, null);
 | 
					        graphics.drawImage(emailLayer, 0, 0, null);
 | 
				
			||||||
        graphics.drawImage(renderLocationLayer(), 0, 0, null);
 | 
					        graphics.drawImage(locationLayer, 0, 0, null);
 | 
				
			||||||
        graphics.drawImage(renderPhoneNumbersLayer(), 0, 0, null);
 | 
					        graphics.drawImage(phoneNumbersLayer, 0, 0, null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        graphics.dispose();
 | 
					        graphics.dispose();
 | 
				
			||||||
        resizeImage();
 | 
					        resizeImage();
 | 
				
			||||||
@ -241,7 +252,7 @@ public class Card {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    private int getOffsets(int type) {
 | 
					    private int getOffsets(int type) {
 | 
				
			||||||
        int totalOffset = 0;
 | 
					        int totalOffset = 0;
 | 
				
			||||||
        int doubleNumberOffset = hasDirectNumber ? 40 : 0;
 | 
					        int doubleNumberOffset = hasCellNumber ? 40 : 0;
 | 
				
			||||||
        int longAddrOffset = fitsDimensions(location.getAddress(), ARIAL38I, 700) ? 0 : 40;
 | 
					        int longAddrOffset = fitsDimensions(location.getAddress(), ARIAL38I, 700) ? 0 : 40;
 | 
				
			||||||
        switch (type) {
 | 
					        switch (type) {
 | 
				
			||||||
            case 0 -> {
 | 
					            case 0 -> {
 | 
				
			||||||
@ -277,31 +288,9 @@ public class Card {
 | 
				
			|||||||
        return resizedImage;
 | 
					        return resizedImage;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void addMetadata() throws IOException {
 | 
					    public byte[] toByteArray() throws IOException {
 | 
				
			||||||
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
 | 
					        ByteArrayOutputStream baos = new ByteArrayOutputStream();
 | 
				
			||||||
        ImageIO.write(workingImage, "png", baos);
 | 
					        ImageIO.write(workingImage, "png", baos);
 | 
				
			||||||
 | 
					 | 
				
			||||||
        ImageReader reader = ImageIO.getImageReadersByMIMEType("image/png").next();
 | 
					 | 
				
			||||||
        reader.setInput(ImageIO.createImageInputStream(new ByteArrayInputStream(baos.toByteArray())));
 | 
					 | 
				
			||||||
        finalImage = reader.readAll(0, null);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        IIOMetadataNode text = new IIOMetadataNode("tEXt");
 | 
					 | 
				
			||||||
        IIOMetadataNode textEntry = new IIOMetadataNode("tEXtEntry");
 | 
					 | 
				
			||||||
        textEntry.setAttribute("contents", toMetaString(this));
 | 
					 | 
				
			||||||
        text.appendChild(textEntry);
 | 
					 | 
				
			||||||
        IIOMetadataNode root = new IIOMetadataNode("javax_imageio_png_1.0");
 | 
					 | 
				
			||||||
        root.appendChild(text);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        finalImage.getMetadata().mergeTree("javax_imageio_png_1.0", root);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public byte[] toByteArray() throws IOException {
 | 
					 | 
				
			||||||
        addMetadata();
 | 
					 | 
				
			||||||
        ImageWriter writer = ImageIO.getImageWritersByMIMEType("image/png").next();
 | 
					 | 
				
			||||||
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
 | 
					 | 
				
			||||||
        ImageOutputStream ios = ImageIO.createImageOutputStream(baos);
 | 
					 | 
				
			||||||
        writer.setOutput(ios);
 | 
					 | 
				
			||||||
        writer.write(finalImage);
 | 
					 | 
				
			||||||
        return baos.toByteArray();
 | 
					        return baos.toByteArray();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -317,38 +306,6 @@ public class Card {
 | 
				
			|||||||
        return C.getFontMetrics(font).stringWidth(text);
 | 
					        return C.getFontMetrics(font).stringWidth(text);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static String toMetaString(Card card) {
 | 
					 | 
				
			||||||
        return "name=" + card.name + ";" +
 | 
					 | 
				
			||||||
                "title=" + card.title + ";" +
 | 
					 | 
				
			||||||
                "email=" + card.email + ";" +
 | 
					 | 
				
			||||||
                "locationId=" + card.location.getId() + ";" +
 | 
					 | 
				
			||||||
                "extension=" + card.extension + ";" +
 | 
					 | 
				
			||||||
                "directNumber=" + card.directNumber + ";" +
 | 
					 | 
				
			||||||
                "cellNumber=" + card.cellNumber + ";";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public static String getDataFromVCard(InputStream rawImage) throws IOException {
 | 
					 | 
				
			||||||
        ImageReader reader = ImageIO.getImageReadersByMIMEType("image/png").next();
 | 
					 | 
				
			||||||
        reader.setInput(ImageIO.createImageInputStream(rawImage));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        IIOMetadata metadata = reader.getImageMetadata(0);
 | 
					 | 
				
			||||||
        IIOMetadataNode root = (IIOMetadataNode) metadata.getAsTree("javax_imageio_png_1.0");
 | 
					 | 
				
			||||||
        IIOMetadataNode text = (IIOMetadataNode) root.getElementsByTagName("tEXt").item(0);
 | 
					 | 
				
			||||||
        if (text == null) {
 | 
					 | 
				
			||||||
            return "$null";
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Map<String, String> keyValueMap = new HashMap<>();
 | 
					 | 
				
			||||||
        String contents = ((IIOMetadataNode) text.item(0)).getAttribute("contents");
 | 
					 | 
				
			||||||
        String[] contentSplit = contents.split(";");
 | 
					 | 
				
			||||||
        for (String entry : contentSplit) {
 | 
					 | 
				
			||||||
            String[] kvPair = entry.split("=");
 | 
					 | 
				
			||||||
            keyValueMap.put(kvPair[0], kvPair[1]);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return new Gson().toJson(keyValueMap);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private static String getUniqueId() {
 | 
					    private static String getUniqueId() {
 | 
				
			||||||
        String uuid = UUID.randomUUID().toString().split("-")[4];
 | 
					        String uuid = UUID.randomUUID().toString().split("-")[4];
 | 
				
			||||||
        while (true) {
 | 
					        while (true) {
 | 
				
			||||||
@ -0,0 +1,46 @@
 | 
				
			|||||||
 | 
					package tech.nevets.signaturecardgen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.google.gson.Gson;
 | 
				
			||||||
 | 
					import com.google.gson.JsonObject;
 | 
				
			||||||
 | 
					import com.google.gson.JsonSyntaxException;
 | 
				
			||||||
 | 
					import spark.Request;
 | 
				
			||||||
 | 
					import spark.Response;
 | 
				
			||||||
 | 
					import spark.Route;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class GenerateRoute implements Route {
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public Object handle(Request req, Response res) {
 | 
				
			||||||
 | 
					    Card card;
 | 
				
			||||||
 | 
					        String id = req.queryParams("id");
 | 
				
			||||||
 | 
					        if (!id.isEmpty()) {
 | 
				
			||||||
 | 
					            card = Card.CARD_SESSIONS.get(id);
 | 
				
			||||||
 | 
					            if (card == null) {
 | 
				
			||||||
 | 
					                res.type("text/plain");
 | 
				
			||||||
 | 
					                res.status(404);
 | 
				
			||||||
 | 
					                return "Card with that id not found.";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            JsonObject data;
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                data = new Gson().fromJson(req.body(), JsonObject.class);
 | 
				
			||||||
 | 
					            } catch (JsonSyntaxException e) {
 | 
				
			||||||
 | 
					                res.status(422);
 | 
				
			||||||
 | 
					                return "Not valid json: " + e.getMessage();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            System.out.println("JSON Data: " + data.toString());
 | 
				
			||||||
 | 
					            card = new Card(data);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        card.renderImage();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        res.type("image/png");
 | 
				
			||||||
 | 
					           try {
 | 
				
			||||||
 | 
					            res.status(200);
 | 
				
			||||||
 | 
					            return card.toByteArray();
 | 
				
			||||||
 | 
					        } catch (IOException e) {
 | 
				
			||||||
 | 
					            res.status(500);
 | 
				
			||||||
 | 
					            return "Error getting image stream: " + e.getMessage();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
package tech.nevets.vcardgen;
 | 
					package tech.nevets.signaturecardgen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.eclipse.jetty.websocket.api.*;
 | 
					import org.eclipse.jetty.websocket.api.*;
 | 
				
			||||||
import org.eclipse.jetty.websocket.api.annotations.*;
 | 
					import org.eclipse.jetty.websocket.api.annotations.*;
 | 
				
			||||||
@ -25,21 +25,25 @@ public class LiveGenWebSocket {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @OnWebSocketError
 | 
					    @OnWebSocketError
 | 
				
			||||||
    public void error(Session session, Throwable throwable) {
 | 
					    public void error(Session session, Throwable throwable) {
 | 
				
			||||||
 | 
					        if (throwable instanceof CloseException) {
 | 
				
			||||||
 | 
					            System.out.println("Connection with session address " + session.getRemoteAddress() + " closed");
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
            throwable.printStackTrace();
 | 
					            throwable.printStackTrace();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @OnWebSocketMessage
 | 
					    @OnWebSocketMessage
 | 
				
			||||||
    public void message(Session session, String message) throws IOException {
 | 
					    public void message(Session session, String message) throws IOException {
 | 
				
			||||||
        RemoteEndpoint client = session.getRemote();
 | 
					        RemoteEndpoint client = session.getRemote();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        System.out.println(message);
 | 
					        System.out.println("WS Msg: " + message);
 | 
				
			||||||
        String[] splitMsg = message.split(";");
 | 
					        String[] splitMsg = message.split(";");
 | 
				
			||||||
        String messageType = splitMsg[0];
 | 
					        String messageType = splitMsg[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (splitMsg.length == 1) {
 | 
					        if (splitMsg.length == 1) {
 | 
				
			||||||
            if (messageType.equals("start")) {
 | 
					            if (messageType.equals("start")) {
 | 
				
			||||||
                card = new Card();
 | 
					                card = new Card();
 | 
				
			||||||
                client.sendString("success;Card successfully created.");
 | 
					                client.sendString("success;" + card.id);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
package tech.nevets.vcardgen;
 | 
					package tech.nevets.signaturecardgen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.google.gson.Gson;
 | 
					import com.google.gson.Gson;
 | 
				
			||||||
import com.google.gson.JsonArray;
 | 
					import com.google.gson.JsonArray;
 | 
				
			||||||
@ -53,6 +53,7 @@ public class Location {
 | 
				
			|||||||
        URL backgroundURL = this.getClass().getResource("/backgrounds/" + id + ".png");
 | 
					        URL backgroundURL = this.getClass().getResource("/backgrounds/" + id + ".png");
 | 
				
			||||||
        if (backgroundURL == null) backgroundURL = this.getClass().getResource("/backgrounds/default.png");
 | 
					        if (backgroundURL == null) backgroundURL = this.getClass().getResource("/backgrounds/default.png");
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
 | 
					            assert backgroundURL != null;
 | 
				
			||||||
            background = ImageIO.read(backgroundURL);
 | 
					            background = ImageIO.read(backgroundURL);
 | 
				
			||||||
        } catch (IOException e) {
 | 
					        } catch (IOException e) {
 | 
				
			||||||
            e.printStackTrace();
 | 
					            e.printStackTrace();
 | 
				
			||||||
@ -86,13 +87,4 @@ public class Location {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        return new Location("", "", "", "");
 | 
					        return new Location("", "", "", "");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    public static String getLocationId(String name) {
 | 
					 | 
				
			||||||
        for (Location loc : LOCATIONS) {
 | 
					 | 
				
			||||||
            if (loc.getName().equals(name)) {
 | 
					 | 
				
			||||||
                return loc.getId();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return null;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
package tech.nevets.vcardgen;
 | 
					package tech.nevets.signaturecardgen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.io.*;
 | 
					import java.io.*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -39,8 +39,6 @@ public class Main {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            post("/generate", new GenerateRoute());
 | 
					            post("/generate", new GenerateRoute());
 | 
				
			||||||
 | 
					 | 
				
			||||||
            post("/edit", new EditRoute());
 | 
					 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -1,45 +0,0 @@
 | 
				
			|||||||
package tech.nevets.vcardgen;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import spark.Request;
 | 
					 | 
				
			||||||
import spark.Response;
 | 
					 | 
				
			||||||
import spark.Route;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.servlet.MultipartConfigElement;
 | 
					 | 
				
			||||||
import javax.servlet.http.Part;
 | 
					 | 
				
			||||||
import java.io.IOException;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class EditRoute implements Route {
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public Object handle(Request req, Response res) {
 | 
					 | 
				
			||||||
        req.attribute("org.eclipse.jetty.multipartConfig", new MultipartConfigElement("/temp"));
 | 
					 | 
				
			||||||
        Part cardFile;
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            cardFile = req.raw().getPart("card");
 | 
					 | 
				
			||||||
        } catch (Exception e) {
 | 
					 | 
				
			||||||
            res.status(500);
 | 
					 | 
				
			||||||
            return "Error processing file: " + e.getMessage();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (cardFile.getSize() > 1000000) {
 | 
					 | 
				
			||||||
            res.status(413);
 | 
					 | 
				
			||||||
            return "File too large";
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (!cardFile.getContentType().equalsIgnoreCase("image/png")) {
 | 
					 | 
				
			||||||
            res.status(415);
 | 
					 | 
				
			||||||
            return "Content is not of type image/png";
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        String cardData;
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            cardData = Card.getDataFromVCard(cardFile.getInputStream());
 | 
					 | 
				
			||||||
        } catch (IOException e) {
 | 
					 | 
				
			||||||
            res.status(500);
 | 
					 | 
				
			||||||
            return "Error retrieving data from card" + e.getMessage();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (cardData.equals("$null")) {
 | 
					 | 
				
			||||||
            res.status(422);
 | 
					 | 
				
			||||||
            return "Card does not contain required metadata";
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        res.type("application/json");
 | 
					 | 
				
			||||||
        res.status(200);
 | 
					 | 
				
			||||||
        return cardData;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,37 +0,0 @@
 | 
				
			|||||||
package tech.nevets.vcardgen;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.google.gson.Gson;
 | 
					 | 
				
			||||||
import com.google.gson.JsonObject;
 | 
					 | 
				
			||||||
import com.google.gson.JsonSyntaxException;
 | 
					 | 
				
			||||||
import spark.Request;
 | 
					 | 
				
			||||||
import spark.Response;
 | 
					 | 
				
			||||||
import spark.Route;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.io.IOException;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class GenerateRoute implements Route {
 | 
					 | 
				
			||||||
    private Card card;
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public Object handle(Request req, Response res) {
 | 
					 | 
				
			||||||
        JsonObject data;
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            data = new Gson().fromJson(req.body(), JsonObject.class);
 | 
					 | 
				
			||||||
        } catch (JsonSyntaxException e) {
 | 
					 | 
				
			||||||
            res.status(422);
 | 
					 | 
				
			||||||
            return "Not valid json: " + e.getMessage();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        card = new Card(data);
 | 
					 | 
				
			||||||
        card.renderImage();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        res.type("image/png");
 | 
					 | 
				
			||||||
        res.header("Access-Control-Expose-Headers", "Id");
 | 
					 | 
				
			||||||
        res.header("Id", card.id);
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            res.status(200);
 | 
					 | 
				
			||||||
            return card.toByteArray();
 | 
					 | 
				
			||||||
        } catch (IOException e) {
 | 
					 | 
				
			||||||
            res.status(500);
 | 
					 | 
				
			||||||
            return "Error getting image stream: " + e.getMessage();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,7 +0,0 @@
 | 
				
			|||||||
package tech.nevets.vcardgen;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class TestMain {
 | 
					 | 
				
			||||||
    public static void main(String[] args) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user