Commit cb63614a by Tuomas Riihimäki

Eeeeh..

PNG generation example
Billing hide property for event
1 parent 172e4d00
Manifest-Version: 1.0 Manifest-Version: 1.0
Class-Path: MoyaBeansClient.jar Class-Path: lib/commons-imaging-1.0-SNAPSHOT.jar
MoyaUtilities.jar lib/MoyaUtilities.jar
lib/MoyaBeansClient.jar
package fi.codecrew.moya.beans; package fi.codecrew.moya.beans;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import java.util.List;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.LocalBean; import javax.ejb.LocalBean;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOInvalidTreeException;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.metadata.IIOMetadataNode;
import javax.imageio.stream.ImageOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.pdfjet.CoreFont; import com.pdfjet.CoreFont;
import com.pdfjet.Image; import com.pdfjet.Image;
...@@ -26,6 +40,7 @@ import fi.codecrew.moya.model.CardTemplate; ...@@ -26,6 +40,7 @@ import fi.codecrew.moya.model.CardTemplate;
import fi.codecrew.moya.model.EventUser; import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.PrintedCard; import fi.codecrew.moya.model.PrintedCard;
import fi.codecrew.moya.util.MassPrintResult; import fi.codecrew.moya.util.MassPrintResult;
import fi.codecrew.moya.utilities.BarcodeUtils;
/** /**
* Session Bean implementation class CardPrintBean * Session Bean implementation class CardPrintBean
...@@ -46,6 +61,7 @@ public class CardPrintBean implements CardPrintBeanLocal { ...@@ -46,6 +61,7 @@ public class CardPrintBean implements CardPrintBeanLocal {
private UserFacade userfacade; private UserFacade userfacade;
@EJB @EJB
private BarcodeBean barcodeBean; private BarcodeBean barcodeBean;
private static final Logger logger = LoggerFactory.getLogger(CardPrintBean.class);
/** /**
* Default constructor. * Default constructor.
...@@ -208,6 +224,94 @@ public class CardPrintBean implements CardPrintBeanLocal { ...@@ -208,6 +224,94 @@ public class CardPrintBean implements CardPrintBeanLocal {
return mpr; return mpr;
} }
@Override
public byte[] constructPNG(EventUser user) throws Exception {
PrintedCard card = cardTemplateBean.checkPrintedCard(user);
logger.info("Printing card {}", card);
BufferedImage face = ImageIO.read(new ByteArrayInputStream(user.getUser().getCurrentImage().getImageData()));
BufferedImage base = ImageIO.read(new ByteArrayInputStream(card.getTemplate().getImage()));
BufferedImage outimage = new BufferedImage(base.getWidth(), base.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g = outimage.createGraphics();
// g.drawImage(org, AffineTransform.getScaleInstance(0.31, 0.31), null);
g.drawImage(base, 0, 0, base.getWidth(), base.getHeight(), null);
// g.drawImage(face, AffineTransform.getScaleInstance(0.31, 0.31),
// null);
g.drawImage(face, 60, 300, 320, 400, null);
g.setFont(new Font("Century gothic", Font.PLAIN, 70));
// g.drawString(nick, 595 -
// g.getFontMetrics().charsWidth(nick.toCharArray(), 0, nick.length()),
// 840);
g.drawString(user.getUser().getNick(), 50, 810);
g.setFont(new Font("Century gothic", Font.BOLD, 45));
StringBuilder wholeName = new StringBuilder();
wholeName.append(user.getUser().getFirstnames()).append(" ").append(user.getUser().getLastname());
// g.setFont(new Font("Arial", Font.BOLD, 35));
// g.drawString(name, 595 -
// g.getFontMetrics().charsWidth(name.toCharArray(), 0, name.length()),
// 890);
//
// g.drawString(owner.getId().toString(), 60, 948);
g.drawString(wholeName.toString(), 60, 865);
g.drawString(card.getTemplate().getName(), 60, 915);
String barcodeString = String.valueOf(user.getUser().getCreated().getTime().getTime());
barcodeString = barcodeString.substring(barcodeString.length() - 12);
BufferedImage image = ImageIO.read(BarcodeUtils.getBarcodeEAN(barcodeString));
g.drawImage(image, 0, base.getHeight() - 120, base.getWidth(), 120, null);
g.dispose();
ByteArrayOutputStream ostr = new ByteArrayOutputStream();
for (Iterator<ImageWriter> pngWriter = ImageIO.getImageWritersByFormatName("png"); pngWriter.hasNext();)
{
ImageWriter writer = pngWriter.next();
logger.info("Trying to write with writer {}", writer);
ImageWriteParam writeParam = writer.getDefaultWriteParam();
ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);
IIOMetadata metadata = writer.getDefaultImageMetadata(typeSpecifier, writeParam);
if (metadata.isReadOnly() || !metadata.isStandardMetadataFormatSupported()) {
continue;
}
setDPI(metadata);
final ImageOutputStream stream = ImageIO.createImageOutputStream(ostr);
try {
writer.setOutput(stream);
writer.write(metadata, new IIOImage(outimage, null, metadata), writeParam);
} finally {
stream.close();
}
break;
}
// ImageIO.write(outimage, "png", ostr);
byte[] ret = ostr.toByteArray();
logger.info("Returning {} bytes for pngimage", ret.length);
// double meter2inchRatio = 1d / 0.0254d;
// int dpi = 300;
// int dim = (int) (dpi * meter2inchRatio) + 1;
return ret;
}
private ByteArrayInputStream convertBufferedImageToPng(BufferedImage img) private ByteArrayInputStream convertBufferedImageToPng(BufferedImage img)
throws IOException { throws IOException {
ByteArrayOutputStream outStream = new ByteArrayOutputStream(); ByteArrayOutputStream outStream = new ByteArrayOutputStream();
...@@ -216,4 +320,25 @@ public class CardPrintBean implements CardPrintBeanLocal { ...@@ -216,4 +320,25 @@ public class CardPrintBean implements CardPrintBeanLocal {
return new ByteArrayInputStream(outStream.toByteArray()); return new ByteArrayInputStream(outStream.toByteArray());
} }
private static void setDPI(IIOMetadata metadata) throws IIOInvalidTreeException {
// for PMG, it's dots per millimeter
double dotsPerMilli = 1.0 * 300 / 10 / 2.54;
IIOMetadataNode horiz = new IIOMetadataNode("HorizontalPixelSize");
horiz.setAttribute("value", Double.toString(dotsPerMilli));
IIOMetadataNode vert = new IIOMetadataNode("VerticalPixelSize");
vert.setAttribute("value", Double.toString(dotsPerMilli));
IIOMetadataNode dim = new IIOMetadataNode("Dimension");
dim.appendChild(horiz);
dim.appendChild(vert);
IIOMetadataNode root = new IIOMetadataNode("javax_imageio_1.0");
root.appendChild(dim);
metadata.mergeTree("javax_imageio_1.0", root);
}
} }
...@@ -120,6 +120,8 @@ public class JaasBean implements MoyaRealmBeanRemote { ...@@ -120,6 +120,8 @@ public class JaasBean implements MoyaRealmBeanRemote {
} }
if (!usr.getUser().isAnonymous()) { if (!usr.getUser().isAnonymous()) {
// all logged in users should be able to logout :)
roleset.add(UserPermission.LOGOUT.name());
roleset.add(SpecialPermission.USER.name()); roleset.add(SpecialPermission.USER.name());
} }
// TODO: EI NÄIN!!!!! Superadmin ei saa kaikkia oikkia!! // TODO: EI NÄIN!!!!! Superadmin ei saa kaikkia oikkia!!
......
...@@ -4,11 +4,16 @@ import java.util.List; ...@@ -4,11 +4,16 @@ import java.util.List;
import javax.ejb.Local; import javax.ejb.Local;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.util.MassPrintResult; import fi.codecrew.moya.util.MassPrintResult;
@Local @Local
public interface CardPrintBeanLocal { public interface CardPrintBeanLocal {
public MassPrintResult getUserCardsAsPrintablePdf(List<Integer> userIdList) throws Exception; public MassPrintResult getUserCardsAsPrintablePdf(List<Integer> userIdList) throws Exception;
public MassPrintResult getUserCardAsPrintablePdf(Integer userId) throws Exception; public MassPrintResult getUserCardAsPrintablePdf(Integer userId) throws Exception;
public void acceptMassPrintResult(MassPrintResult mpr); public void acceptMassPrintResult(MassPrintResult mpr);
byte[] constructPNG(EventUser user) throws Exception;
} }
...@@ -12,7 +12,9 @@ public enum LanEventPropertyKey { ...@@ -12,7 +12,9 @@ public enum LanEventPropertyKey {
PLACECODE_FROM_USER(Type.BOOL, null), PLACECODE_FROM_USER(Type.BOOL, null),
PLACECODE_PRINT_ONLY_OWN(Type.BOOL, null), PLACECODE_PRINT_ONLY_OWN(Type.BOOL, null),
CHECK_BILL_STATS_PERMISSION(Type.BOOL, null), CHECK_BILL_STATS_PERMISSION(Type.BOOL, null),
GATHER_OTHER_BILL_INFO(Type.BOOL, null), ; GATHER_OTHER_BILL_INFO(Type.BOOL, null),
ALLOW_BILLING(Type.BOOL, null);
;
private enum Type { private enum Type {
TEXT, DATE, DATA, BOOL TEXT, DATE, DATA, BOOL
......
...@@ -17,8 +17,9 @@ public enum UserPermission implements IAppPermission { ...@@ -17,8 +17,9 @@ public enum UserPermission implements IAppPermission {
MANAGE_HTTP_SESSION, // ("Manage http sessions"), MANAGE_HTTP_SESSION, // ("Manage http sessions"),
INVITE_USERS, // ("Invite users"), INVITE_USERS, // ("Invite users"),
READ_ORGROLES, // ("View organization roles"), READ_ORGROLES, // ("View organization roles"),
WRITE_ORGROLES, VITUTTAAKO, // ("Modify organization roles"), WRITE_ORGROLES, // ("Modify organization roles"),
; VITUTTAAKO,
LOGGED_IN_USER;
public static final String S_VIEW_ALL = "USER/VIEW_ALL"; public static final String S_VIEW_ALL = "USER/VIEW_ALL";
public static final String S_MODIFY = "USER/MODIFY"; public static final String S_MODIFY = "USER/MODIFY";
......
package fi.codecrew.moya.utilities;
import java.awt.color.ColorSpace;
import java.awt.color.ICC_ColorSpace;
import java.awt.color.ICC_Profile;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.imageio.IIOException;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import org.apache.commons.imaging.ImageReadException;
import org.apache.commons.imaging.Imaging;
import org.apache.commons.imaging.common.bytesource.ByteSource;
import org.apache.commons.imaging.common.bytesource.ByteSourceFile;
import org.apache.commons.imaging.formats.jpeg.JpegImageParser;
import org.apache.commons.imaging.formats.jpeg.segments.Segment;
import org.apache.commons.imaging.formats.jpeg.segments.UnknownSegment;
public class JpegReader {
public static final int COLOR_TYPE_RGB = 1;
public static final int COLOR_TYPE_CMYK = 2;
public static final int COLOR_TYPE_YCCK = 3;
private int colorType = COLOR_TYPE_RGB;
private boolean hasAdobeMarker = false;
public BufferedImage readImage(File file) throws IOException, ImageReadException {
colorType = COLOR_TYPE_RGB;
hasAdobeMarker = false;
ImageInputStream stream = ImageIO.createImageInputStream(file);
Iterator<ImageReader> iter = ImageIO.getImageReaders(stream);
while (iter.hasNext()) {
ImageReader reader = iter.next();
reader.setInput(stream);
BufferedImage image;
ICC_Profile profile = null;
try {
image = reader.read(0);
} catch (IIOException e) {
colorType = COLOR_TYPE_CMYK;
checkAdobeMarker(file);
profile = Imaging.getICCProfile(file);
WritableRaster raster = (WritableRaster) reader.readRaster(0, null);
if (colorType == COLOR_TYPE_YCCK)
convertYcckToCmyk(raster);
if (hasAdobeMarker)
convertInvertedColors(raster);
image = convertCmykToRgb(raster, profile);
}
return image;
}
return null;
}
public void checkAdobeMarker(File file) throws IOException, ImageReadException {
JpegImageParser parser = new JpegImageParser();
ByteSource byteSource = new ByteSourceFile(file);
@SuppressWarnings("rawtypes")
List<Segment> segments = parser.readSegments(byteSource, new int[] { 0xffee }, true);
if (segments != null && segments.size() >= 1) {
UnknownSegment app14Segment = (UnknownSegment) segments.get(0);
byte[] data = app14Segment.bytes;
if (data.length >= 12 && data[0] == 'A' && data[1] == 'd' && data[2] == 'o' && data[3] == 'b' && data[4] == 'e')
{
hasAdobeMarker = true;
int transform = app14Segment.bytes[11] & 0xff;
if (transform == 2)
colorType = COLOR_TYPE_YCCK;
}
}
}
public static void convertYcckToCmyk(WritableRaster raster) {
int height = raster.getHeight();
int width = raster.getWidth();
int stride = width * 4;
int[] pixelRow = new int[stride];
for (int h = 0; h < height; h++) {
raster.getPixels(0, h, width, 1, pixelRow);
for (int x = 0; x < stride; x += 4) {
int y = pixelRow[x];
int cb = pixelRow[x + 1];
int cr = pixelRow[x + 2];
int c = (int) (y + 1.402 * cr - 178.956);
int m = (int) (y - 0.34414 * cb - 0.71414 * cr + 135.95984);
y = (int) (y + 1.772 * cb - 226.316);
if (c < 0)
c = 0;
else if (c > 255)
c = 255;
if (m < 0)
m = 0;
else if (m > 255)
m = 255;
if (y < 0)
y = 0;
else if (y > 255)
y = 255;
pixelRow[x] = 255 - c;
pixelRow[x + 1] = 255 - m;
pixelRow[x + 2] = 255 - y;
}
raster.setPixels(0, h, width, 1, pixelRow);
}
}
public static void convertInvertedColors(WritableRaster raster) {
int height = raster.getHeight();
int width = raster.getWidth();
int stride = width * 4;
int[] pixelRow = new int[stride];
for (int h = 0; h < height; h++) {
raster.getPixels(0, h, width, 1, pixelRow);
for (int x = 0; x < stride; x++)
pixelRow[x] = 255 - pixelRow[x];
raster.setPixels(0, h, width, 1, pixelRow);
}
}
public static BufferedImage convertCmykToRgb(Raster cmykRaster, ICC_Profile cmykProfile) throws IOException {
if (cmykProfile == null)
cmykProfile = ICC_Profile.getInstance(JpegReader.class.getResourceAsStream("ISOcoated_v2_300_eci.icc"));
ICC_ColorSpace cmykCS = new ICC_ColorSpace(cmykProfile);
BufferedImage rgbImage = new BufferedImage(cmykRaster.getWidth(), cmykRaster.getHeight(), BufferedImage.TYPE_INT_RGB);
WritableRaster rgbRaster = rgbImage.getRaster();
ColorSpace rgbCS = rgbImage.getColorModel().getColorSpace();
ColorConvertOp cmykToRgb = new ColorConvertOp(cmykCS, rgbCS, null);
cmykToRgb.filter(cmykRaster, rgbRaster);
return rgbImage;
}
}
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
<h:inputText id="paidDate" value="#{billEditView.bill.paidDate}"> <h:inputText id="paidDate" value="#{billEditView.bill.paidDate}">
<f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" timeZone="#{sessionHandler.timezone}" /> <f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" timeZone="#{sessionHandler.timezone}" />
</h:inputText> </h:inputText>
<h:outputLabel for="billnr" value="#{i18n['bill.billNumber']}:" /> <h:outputLabel for="billnr" value="#{i18n['bill.billNumber']}:" />
<h:inputText id="billnr" value="#{billEditView.bill.billNumber}" /> <h:inputText id="billnr" value="#{billEditView.bill.billNumber}" />
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:tools="http://java.sun.com/jsf/composite/tools" <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:tools="http://java.sun.com/jsf/composite/tools"
xmlns:bill="http://java.sun.com/jsf/composite/cditools/bills" xmlns:p="http://primefaces.org/ui" xmlns:f="http://java.sun.com/jsf/core"> xmlns:bill="http://java.sun.com/jsf/composite/cditools/bills" xmlns:p="http://primefaces.org/ui" xmlns:f="http://java.sun.com/jsf/core">
<h:body> <h:body>
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
<f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" timeZone="#{sessionHandler.timezone}" /> <f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" timeZone="#{sessionHandler.timezone}" />
</h:outputText> </h:outputText>
</ui:fragment> </ui:fragment>
<br />
<bill:showBill bill="#{billEditView.bill}" /> <bill:showBill bill="#{billEditView.bill}" />
...@@ -58,19 +58,19 @@ ...@@ -58,19 +58,19 @@
</tr> </tr>
</table> </table>
</ui:fragment> </ui:fragment>
<ui:fragment rendered="#{!billEditView.bill.paid and !billEditView.bill.expired}"> <ui:fragment rendered="#{!billEditView.bill.paid and !billEditView.bill.expired}">
<h:form> <h:form>
<p:commandButton id="cancelbtn" onclick="confirmation.show()" value="#{i18n['bill.cancel']}" /> <p:commandButton id="cancelbtn" onclick="confirmation.show()" value="#{i18n['bill.cancel']}" />
<p:confirmDialog id="confirmDialog" message="#{i18n['generic.sure.message']}" header="#{i18n['generic.sure.header']}" severity="alert" widgetVar="confirmation"> <p:confirmDialog id="confirmDialog" message="#{i18n['generic.sure.message']}" header="#{i18n['generic.sure.header']}" severity="alert" widgetVar="confirmation">
<p:commandButton value="#{i18n['generic.sure.yes']}" onclick="confirmation.hide()" actionListener="#{billEditView.expireBill()}" ajax="false" /> <p:commandButton value="#{i18n['generic.sure.yes']}" onclick="confirmation.hide()" actionListener="#{billEditView.expireBill()}" ajax="false" />
<p:commandButton value="#{i18n['generic.sure.no']}" onclick="confirmation.hide()" type="button" /> <p:commandButton value="#{i18n['generic.sure.no']}" onclick="confirmation.hide()" type="button" />
</p:confirmDialog> </p:confirmDialog>
</h:form> </h:form>
</ui:fragment> </ui:fragment>
</ui:define> </ui:define>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:composite="http://java.sun.com/jsf/composite" <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://primefaces.org/ui" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:tools="http://java.sun.com/jsf/composite/tools"> xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://primefaces.org/ui" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:tools="http://java.sun.com/jsf/composite/tools">
<composite:interface> <composite:interface>
</composite:interface> </composite:interface>
...@@ -10,17 +10,18 @@ ...@@ -10,17 +10,18 @@
<composite:implementation> <composite:implementation>
<h:outputText rendered="#{billListView.bills.rowCount le 0}" value="#{i18n['bills.noBills']}" /> <h:outputText rendered="#{billListView.bills.rowCount le 0}" value="#{i18n['bills.noBills']}" />
<!-- koyhan miehen confirmaationappi: --> <ui:fragment rendered="#{billListView.canWriteBill}">
<input type="button" class="ui-button ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" style="padding: 3px;" value="#{i18n['bill.markPaid.show']}" onclick="showMarkPaidButtons();" /> <!-- koyhan miehen confirmaationappi: -->
<input type="button" class="ui-button ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" style="padding: 3px;" value="#{i18n['bill.markPaid.show']}"
onclick="showMarkPaidButtons();" />
</ui:fragment>
<h:form rendered="#{billListView.bills.rowCount gt 0}"> <h:form rendered="#{billListView.bills.rowCount gt 0}">
<p:dataTable styleClass="bordertable" id="billList" value="#{billListView.bills}" var="bill" <p:dataTable styleClass="bordertable" id="billList" value="#{billListView.bills}" var="bill" rowStyleClass="#{bill.expired ? 'expired' : (bill.paidDate != null ? 'paid' : null)}">
rowStyleClass="#{bill.expired ? 'expired' : (bill.paidDate != null ? 'paid' : null)}" >
<p:column rendered="#{billListView.canWriteBill}"> <p:column rendered="#{billListView.canWriteBill}">
<f:facet name="header"> <f:facet name="header">
<h:outputText value="#{i18n['bill.payer']}" /> <h:outputText value="#{i18n['bill.payer']}" />
...@@ -35,7 +36,7 @@ ...@@ -35,7 +36,7 @@
<h:outputText value="${i18n['bill.sentDate']}" /> <h:outputText value="${i18n['bill.sentDate']}" />
</f:facet> </f:facet>
<h:outputText value="#{bill.sentDateTime}"> <h:outputText value="#{bill.sentDateTime}">
<f:convertDateTime pattern="#{sessionHandler.dateFormat}" timeZone="#{sessionHandler.timezone}" /> <f:convertDateTime pattern="#{sessionHandler.dateFormat}" timeZone="#{sessionHandler.timezone}" />
</h:outputText> </h:outputText>
</p:column> </p:column>
<p:column> <p:column>
...@@ -60,9 +61,8 @@ ...@@ -60,9 +61,8 @@
<f:convertNumber currencyCode="EUR" maxFractionDigits="2" minFractionDigits="2" type="currency" /> <f:convertNumber currencyCode="EUR" maxFractionDigits="2" minFractionDigits="2" type="currency" />
</h:outputText> </h:outputText>
</p:column> </p:column>
<p:column> <p:column rendered="#{(!bill.expired and sessionHandler.isEventBoolProperty('ALLOW_BILLING')) or billListView.canWriteBill}">
<ui:fragment>
<ui:fragment rendered="#{!bill.expired}">
<a href="#{request.contextPath}/PrintBill?billid=#{bill.id}" target="_blank">#{i18n['bill.printBill']}</a> <a href="#{request.contextPath}/PrintBill?billid=#{bill.id}" target="_blank">#{i18n['bill.printBill']}</a>
</ui:fragment> </ui:fragment>
</p:column> </p:column>
...@@ -87,7 +87,7 @@ ...@@ -87,7 +87,7 @@
</h:form> </h:form>
<script type="text/javascript"> <script type="text/javascript">
function showMarkPaidButtons() { function showMarkPaidButtons() {
$(".markPaidButton").removeAttr('disabled'); $(".markPaidButton").removeAttr('disabled');
} }
......
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
<h:outputText rendered="#{cc.attrs.bill.expired}" id="expired" value="#{i18n['bill.isExpired']}" /> <h:outputText rendered="#{cc.attrs.bill.expired}" id="expired" value="#{i18n['bill.isExpired']}" />
</h:panelGrid> </h:panelGrid>
<h:panelGrid columns="2" columnClasses="topalign,topalign"> <h:panelGrid columns="2" columnClasses="topalign,topalign">
<h:outputLabel for="address" value="#{i18n['bill.address']}:" /> <h:outputLabel for="address" value="#{i18n['bill.address']}:" />
<h:panelGroup id="address"> <h:panelGroup id="address">
...@@ -66,15 +67,15 @@ ...@@ -66,15 +67,15 @@
<h:outputText rendered="#{!empty cc.attrs.bill.event.organiser.billAddress4}" value="&lt;br />" escape="false" /> <h:outputText rendered="#{!empty cc.attrs.bill.event.organiser.billAddress4}" value="&lt;br />" escape="false" />
<h:outputText id="recAddr4" value="#{cc.attrs.bill.event.organiser.billAddress4}" /> <h:outputText id="recAddr4" value="#{cc.attrs.bill.event.organiser.billAddress4}" />
</h:panelGroup> </h:panelGroup>
<h:outputLabel rendered="#{!cc.attrs.bill.expired and !empty cc.attrs.bill.event.organiser.bankName1}" for="bankname1" value="#{i18n['eventorg.bankName1']}" /> <h:outputLabel rendered="#{!cc.attrs.bill.expired and sessionHandler.isEventBoolProperty('ALLOW_BILLING') and !empty cc.attrs.bill.event.organiser.bankName1}" for="bankname1" value="#{i18n['eventorg.bankName1']}" />
<h:outputText rendered="#{!cc.attrs.bill.expired and !empty cc.attrs.bill.event.organiser.bankName1}" id="bankname1" value="#{cc.attrs.bill.event.organiser.bankName1}" /> <h:outputText rendered="#{!cc.attrs.bill.expired and sessionHandler.isEventBoolProperty('ALLOW_BILLING') and !empty cc.attrs.bill.event.organiser.bankName1}" id="bankname1" value="#{cc.attrs.bill.event.organiser.bankName1}" />
<h:outputLabel rendered="#{!cc.attrs.bill.expired and !empty cc.attrs.bill.event.organiser.bankNumber1}" for="banknumber1" value="#{i18n['eventorg.bankNumber1']}" /> <h:outputLabel rendered="#{!cc.attrs.bill.expired and sessionHandler.isEventBoolProperty('ALLOW_BILLING') and !empty cc.attrs.bill.event.organiser.bankNumber1}" for="banknumber1" value="#{i18n['eventorg.bankNumber1']}" />
<h:outputText rendered="#{!cc.attrs.bill.expired and !empty cc.attrs.bill.event.organiser.bankNumber1}" id="banknumber1" value="#{cc.attrs.bill.event.organiser.bankNumber1}" /> <h:outputText rendered="#{!cc.attrs.bill.expired and sessionHandler.isEventBoolProperty('ALLOW_BILLING') and !empty cc.attrs.bill.event.organiser.bankNumber1}" id="banknumber1" value="#{cc.attrs.bill.event.organiser.bankNumber1}" />
<h:outputLabel rendered="#{!cc.attrs.bill.expired and !empty cc.attrs.bill.event.organiser.bankName2}" for="bankname2" value="#{i18n['eventorg.bankName2']}" /> <h:outputLabel rendered="#{!cc.attrs.bill.expired and sessionHandler.isEventBoolProperty('ALLOW_BILLING') and !empty cc.attrs.bill.event.organiser.bankName2}" for="bankname2" value="#{i18n['eventorg.bankName2']}" />
<h:outputText rendered="#{!cc.attrs.bill.expired and !empty cc.attrs.bill.event.organiser.bankName2}" id="bankname2" value="#{cc.attrs.bill.event.organiser.bankName2}" /> <h:outputText rendered="#{!cc.attrs.bill.expired and sessionHandler.isEventBoolProperty('ALLOW_BILLING') and !empty cc.attrs.bill.event.organiser.bankName2}" id="bankname2" value="#{cc.attrs.bill.event.organiser.bankName2}" />
<h:outputLabel rendered="#{!cc.attrs.bill.expired and !empty cc.attrs.bill.event.organiser.bankNumber2}" for="banknumber2" value="#{i18n['eventorg.bankNumber2']}" /> <h:outputLabel rendered="#{!cc.attrs.bill.expired and sessionHandler.isEventBoolProperty('ALLOW_BILLING') and !empty cc.attrs.bill.event.organiser.bankNumber2}" for="banknumber2" value="#{i18n['eventorg.bankNumber2']}" />
<h:outputText rendered="#{!cc.attrs.bill.expired and !empty cc.attrs.bill.event.organiser.bankNumber2}" id="banknumber2" value="#{cc.attrs.bill.event.organiser.bankNumber2}" /> <h:outputText rendered="#{!cc.attrs.bill.expired and sessionHandler.isEventBoolProperty('ALLOW_BILLING') and !empty cc.attrs.bill.event.organiser.bankNumber2}" id="banknumber2" value="#{cc.attrs.bill.event.organiser.bankNumber2}" />
</h:panelGrid> </h:panelGrid>
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
*/ */
package fi.codecrew.moya.handler; package fi.codecrew.moya.handler;
import java.util.EnumMap;
import java.util.TimeZone; import java.util.TimeZone;
import javax.ejb.EJB; import javax.ejb.EJB;
...@@ -22,6 +23,7 @@ import fi.codecrew.moya.beans.RoleBeanLocal; ...@@ -22,6 +23,7 @@ import fi.codecrew.moya.beans.RoleBeanLocal;
import fi.codecrew.moya.clientutils.BortalLocalContextHolder; import fi.codecrew.moya.clientutils.BortalLocalContextHolder;
import fi.codecrew.moya.enums.apps.IAppPermission; import fi.codecrew.moya.enums.apps.IAppPermission;
import fi.codecrew.moya.model.EventUser; import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.LanEventProperty;
import fi.codecrew.moya.model.LanEventPropertyKey; import fi.codecrew.moya.model.LanEventPropertyKey;
/** /**
...@@ -94,6 +96,30 @@ public class SessionHandler { ...@@ -94,6 +96,30 @@ public class SessionHandler {
return getTemplatePath() + "/template.xhtml"; return getTemplatePath() + "/template.xhtml";
} }
private EnumMap<LanEventPropertyKey, Boolean> boolPropertyCache = new EnumMap<>(LanEventPropertyKey.class);
public boolean isEventBoolProperty(String property)
{
LanEventPropertyKey prop = LanEventPropertyKey.valueOf(property);
if (!prop.isBoolean()) {
throw new RuntimeException("Trying to fetch boolean value for non-boolean property!");
}
boolean value = false;
if (boolPropertyCache.containsKey(prop)) {
value = boolPropertyCache.get(prop);
} else {
LanEventProperty propertyValue = eventbean.getProperty(prop);
if (propertyValue == null) {
if (prop.getDefaultvalue() != null && prop.getDefaultvalue().equals("1"))
value = true;
} else {
value = propertyValue.isBooleanValue();
}
boolPropertyCache.put(prop, value);
}
return value;
}
// public boolean hasPermission(String target, String permission) { // public boolean hasPermission(String target, String permission) {
// RolePermission perm = RolePermission.valueOf(permission.toUpperCase()); // RolePermission perm = RolePermission.valueOf(permission.toUpperCase());
// // RolePermission perm = null; // // RolePermission perm = null;
......
...@@ -63,7 +63,7 @@ public abstract class GenericImageServlet extends HttpServlet { ...@@ -63,7 +63,7 @@ public abstract class GenericImageServlet extends HttpServlet {
} }
@SuppressWarnings("unused") @SuppressWarnings("unused")
private static final Logger logger = LoggerFactory.getLogger(UserImageServlet.class); private static final Logger logger = LoggerFactory.getLogger(GenericImageServlet.class);
protected abstract ImageMover getImagedata(); protected abstract ImageMover getImagedata();
......
package fi.codecrew.moya.servlet;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.ejb.EJB;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.beans.PermissionBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.model.UserImage;
/**
* Servlet implementation class UploadServlet
*/
public class UserCardPngServlet extends GenericImageServlet {
/**
*
*/
private static final long serialVersionUID = -3359999630873773508L;
@EJB
private transient UserBeanLocal userbean;
@EJB
private transient PermissionBeanLocal permbean;
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
// private final Pattern lhMatcher =
// Pattern.compile("^(10|127).[0-9.]*|(0:)*1%0");
private static final Logger logger = LoggerFactory.getLogger(UserCardPngServlet.class);
private static final Pattern URLPATTERN = Pattern.compile("([^./]+)");
// /dydata/(userimage|...)/stuff...
@Override
protected ImageMover getImagedata() {
ImageMover ret = new ImageMover();
List<String> urlparts = new ArrayList<String>();
if (super.request.getPathInfo() != null)
{
Matcher matcher = URLPATTERN.matcher(super.request.getPathInfo());
logger.info("urlparts {}", urlparts);
while (matcher.find()) {
urlparts.add(matcher.group());
}
}
if (urlparts.isEmpty()) {
ret.setResponse(HttpServletResponse.SC_NOT_FOUND);
} else if (urlparts.get(0).equals("userimage") && urlparts.size() > 2) {
int imageid = Integer.parseInt(urlparts.get(1));
UserImage image = userbean.findUserimageFORCE(imageid);
if (image != null)
{
ret.setData(image.getImageData());
ret.setImagetype(image.getMimeType());
}
}
if (ret.getImagetype() == null) {
ret.setResponse(HttpServletResponse.SC_NOT_FOUND);
}
return ret;
}
// protected ImageMover getImagedata2() {
// ImageMover ret = new ImageMover();
// UserImage image =
// userbean.findUserimageFORCE(super.getIdParam("imageid"));
// if (image != null) { // &&
// // if (permbean.isCurrentUser(image.getUser()) ||
// // permbean.hasPermission(UserPermission.MODIFY) ||
// // lhMatcher.matcher(request.getLocalAddr()).matches())
// // {
// ret.setData(image.getImageData());
// ret.setImagetype(image.getMimeType());
// // }
// // else
// // {
// // ret.setResponse(HttpServletResponse.SC_FORBIDDEN);
// // }
//
// } else
// {
// ret.setResponse(HttpServletResponse.SC_NOT_FOUND);
// }
// return ret;
//
// }
}
package fi.codecrew.moya.servlet; package fi.codecrew.moya.servlet;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
...@@ -17,7 +15,6 @@ import javax.servlet.http.HttpServletResponse; ...@@ -17,7 +15,6 @@ import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import com.pdfjet.Box;
import com.pdfjet.CoreFont; import com.pdfjet.CoreFont;
import com.pdfjet.Image; import com.pdfjet.Image;
import com.pdfjet.ImageType; import com.pdfjet.ImageType;
...@@ -94,66 +91,6 @@ public class UserCardServlet extends GenericImageServlet { ...@@ -94,66 +91,6 @@ public class UserCardServlet extends GenericImageServlet {
} }
private byte[] mkCardJpeg(PrintedCard card) throws IOException {
EventUser user = card.getUser();
BufferedImage face = ImageIO.read(new ByteArrayInputStream(user
.getUser().getCurrentImage().getImageData()));
BufferedImage base = ImageIO.read(new ByteArrayInputStream(card
.getTemplate().getImage()));
BufferedImage outimage = new BufferedImage(base.getWidth(),
base.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g = outimage.createGraphics();
// g.drawImage(org, AffineTransform.getScaleInstance(0.31, 0.31), null);
g.drawImage(base, 0, 0, base.getWidth(), base.getHeight(), null);
// g.drawImage(face, AffineTransform.getScaleInstance(0.31, 0.31),
// null);
g.drawImage(face, 60, 300, 320, 400, null);
g.setFont(new Font("Century gothic", Font.PLAIN, 70));
// g.drawString(nick, 595 -
// g.getFontMetrics().charsWidth(nick.toCharArray(), 0, nick.length()),
// 840);
g.drawString(user.getUser().getNick(), 50, 810);
g.setFont(new Font("Century gothic", Font.BOLD, 45));
StringBuilder wholeName = new StringBuilder();
wholeName.append(user.getUser().getFirstnames()).append(" ")
.append(user.getUser().getLastname());
// g.setFont(new Font("Arial", Font.BOLD, 35));
// g.drawString(name, 595 -
// g.getFontMetrics().charsWidth(name.toCharArray(), 0, name.length()),
// 890);
//
// g.drawString(owner.getId().toString(), 60, 948);
g.drawString(wholeName.toString(), 60, 865);
g.drawString(card.getTemplate().getName(), 60, 915);
String barcodeString = String.valueOf(user.getUser().getCreated()
.getTime().getTime());
barcodeString = barcodeString.substring(barcodeString.length() - 12);
BufferedImage image = ImageIO.read(BarcodeUtils
.getBarcodeEAN(barcodeString));
g.drawImage(image, 0, base.getHeight() - 120, base.getWidth(), 120,
null);
g.dispose();
ByteArrayOutputStream ostr = new ByteArrayOutputStream();
ImageIO.write(outimage, "jpeg", ostr);
return ostr.toByteArray();
}
// 300 dpi, 1016 px pituus, 648 px leveys, // 300 dpi, 1016 px pituus, 648 px leveys,
// 85,5 mm x 54,0 mm // 85,5 mm x 54,0 mm
private byte[] mkCard(PrintedCard card) throws Exception { private byte[] mkCard(PrintedCard card) throws Exception {
...@@ -190,7 +127,7 @@ public class UserCardServlet extends GenericImageServlet { ...@@ -190,7 +127,7 @@ public class UserCardServlet extends GenericImageServlet {
Image faceImage = new Image(pdf, Image faceImage = new Image(pdf,
convertBufferedImageToPng(faceBufferedImage), ImageType.PNG); convertBufferedImageToPng(faceBufferedImage), ImageType.PNG);
faceImage.setPosition(15.5, 70.0); faceImage.setPosition(15.5, 70.0);
faceImage.scaleBy((410.0/faceImage.getHeight())); faceImage.scaleBy((410.0 / faceImage.getHeight()));
faceImage.drawOn(page); faceImage.drawOn(page);
// Render texts // Render texts
...@@ -202,27 +139,27 @@ public class UserCardServlet extends GenericImageServlet { ...@@ -202,27 +139,27 @@ public class UserCardServlet extends GenericImageServlet {
TextLine nickTextLine = new TextLine(nickFont); TextLine nickTextLine = new TextLine(nickFont);
nickTextLine.setText(user.getUser().getNick()); nickTextLine.setText(user.getUser().getNick());
nickTextLine.setPosition(19.0, 193.0); nickTextLine.setPosition(19.0, 193.0);
nickTextLine.setColor(new double[] {1.0, 1.0, 1.0}); nickTextLine.setColor(new double[] { 1.0, 1.0, 1.0 });
nickTextLine.drawOn(page); nickTextLine.drawOn(page);
// Smaller font // Smaller font
com.pdfjet.Font font = new com.pdfjet.Font(pdf, CoreFont.HELVETICA); com.pdfjet.Font font = new com.pdfjet.Font(pdf, CoreFont.HELVETICA);
font.setSize(10.0); font.setSize(10.0);
// Full name text // Full name text
String wholeName = user.getUser().getFirstnames() + " " String wholeName = user.getUser().getFirstnames() + " "
+ user.getUser().getLastname(); + user.getUser().getLastname();
TextLine wholeNameText = new TextLine(font); TextLine wholeNameText = new TextLine(font);
wholeNameText.setText(wholeName); wholeNameText.setText(wholeName);
wholeNameText.setPosition(17.0, 212.0); wholeNameText.setPosition(17.0, 212.0);
wholeNameText.setColor(new double[] {1.0, 1.0, 1.0}); wholeNameText.setColor(new double[] { 1.0, 1.0, 1.0 });
wholeNameText.drawOn(page); wholeNameText.drawOn(page);
// Role text // Role text
TextLine roleTextLine = new TextLine(font); TextLine roleTextLine = new TextLine(font);
roleTextLine.setText(card.getTemplate().getName()); roleTextLine.setText(card.getTemplate().getName());
roleTextLine.setPosition(17.0, 223.0); roleTextLine.setPosition(17.0, 223.0);
roleTextLine.setColor(new double[] {1.0, 1.0, 1.0}); roleTextLine.setColor(new double[] { 1.0, 1.0, 1.0 });
roleTextLine.drawOn(page); roleTextLine.drawOn(page);
// Barcode // Barcode
......
package fi.codecrew.moya.servlet; package fi.codecrew.moya.servlet;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.servlet.http.HttpServlet; import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.codecrew.moya.beans.CardPrintBeanLocal;
import fi.codecrew.moya.beans.PermissionBeanLocal; import fi.codecrew.moya.beans.PermissionBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal; import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.model.UserImage; import fi.codecrew.moya.model.EventUser;
/** /**
* Servlet implementation class UploadServlet * Servlet implementation class UploadServlet
*/ */
public class UserImageServlet extends GenericImageServlet {
@WebServlet(urlPatterns = "/png")
public class UserPngImageServlet extends GenericImageServlet {
public UserPngImageServlet() {
super();
// TODO Auto-generated constructor stub
}
/** /**
* *
...@@ -32,40 +34,33 @@ public class UserImageServlet extends GenericImageServlet { ...@@ -32,40 +34,33 @@ public class UserImageServlet extends GenericImageServlet {
@EJB @EJB
private transient PermissionBeanLocal permbean; private transient PermissionBeanLocal permbean;
@EJB
private CardPrintBeanLocal cardprint;
/** private static final Logger logger = LoggerFactory.getLogger(UserPngImageServlet.class);
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
// private final Pattern lhMatcher =
// Pattern.compile("^(10|127).[0-9.]*|(0:)*1%0");
private static final Logger logger = LoggerFactory.getLogger(UserImageServlet.class);
private static final Pattern URLPATTERN = Pattern.compile("([^./]+)");
// /dydata/(userimage|...)/stuff... // /dydata/(userimage|...)/stuff...
@Override @Override
protected ImageMover getImagedata() { protected ImageMover getImagedata() {
EventUser usr = permbean.getCurrentUser();
logger.info("Trying to print imagedata for user {}", usr);
ImageMover ret = new ImageMover(); ImageMover ret = new ImageMover();
Matcher matcher = URLPATTERN.matcher(super.request.getPathInfo());
List<String> urlparts = new ArrayList<String>();
logger.info("urlparts {}", urlparts);
while (matcher.find()) { if (usr != null) {
urlparts.add(matcher.group()); try {
}
if (urlparts.isEmpty()) { byte[] img = cardprint.constructPNG(usr);
ret.setResponse(HttpServletResponse.SC_NOT_FOUND);
} else if (urlparts.get(0).equals("userimage") && urlparts.size() > 2) { if (img.length > 0)
int imageid = Integer.parseInt(urlparts.get(1)); {
UserImage image = userbean.findUserimageFORCE(imageid); ret.setData(img);
if (image != null) ret.setImagetype("image/png");
{ }
ret.setData(image.getImageData()); } catch (Exception e) {
ret.setImagetype(image.getMimeType()); // TODO Auto-generated catch block
e.printStackTrace();
} }
} }
...@@ -75,7 +70,6 @@ public class UserImageServlet extends GenericImageServlet { ...@@ -75,7 +70,6 @@ public class UserImageServlet extends GenericImageServlet {
return ret; return ret;
} }
// protected ImageMover getImagedata2() { // protected ImageMover getImagedata2() {
// ImageMover ret = new ImageMover(); // ImageMover ret = new ImageMover();
// UserImage image = // UserImage image =
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!