diff --git a/build.third_step1.gradle b/build.third_step1.gradle index 198247ae4..2e561dc79 100644 --- a/build.third_step1.gradle +++ b/build.third_step1.gradle @@ -58,6 +58,7 @@ repositories{ FileTree files =fileTree(dir:'./',include:'build.*.gradle') def buildDir=files[0].path.substring(0,files[0].path.lastIndexOf (java.io.File.separator)) def branchName=buildDir.substring(buildDir.lastIndexOf (java.io.File.separator)+1) +def MVN_BRANCH = branchVariable.toUpperCase() //指定依赖 dependencies{ @@ -65,7 +66,7 @@ dependencies{ compile fileTree(dir:"${srcDir}/fine-quartz/lib",include:'**/*.jar') compile fileTree(dir:"${srcDir}/build/libs/",include:'**/*.jar') // @branch - 分支信息 - compile "com.fr.third:fine-third:10.0-FINAL-SNAPSHOT" + compile "com.fr.third:fine-third:10.0-${MVN_BRANCH}-SNAPSHOT" compile fileTree(dir:"../../finereport-lib-other/${branchName}",include:'**/*.jar') testCompile 'junit:junit:4.12' } diff --git a/build.third_step2.gradle b/build.third_step2.gradle index aa1d2d9a1..d65d684a4 100644 --- a/build.third_step2.gradle +++ b/build.third_step2.gradle @@ -46,6 +46,7 @@ repositories{ FileTree files =fileTree(dir:'./',include:'build.*.gradle') def buildDir=files[0].path.substring(0,files[0].path.lastIndexOf (java.io.File.separator)) def branchName=buildDir.substring(buildDir.lastIndexOf (java.io.File.separator)+1) +def MVN_BRANCH = branchVariable.toUpperCase() //指定依赖 dependencies{ @@ -55,7 +56,7 @@ dependencies{ compile fileTree(dir:"${srcDir}/fine-antlr4/lib",include: '**/*.jar') compile fileTree(dir:"${srcDir}/build/libs/",include:'**/*.jar') // @branch - 分支信息 - compile "com.fr.third:fine-third:10.0-FINAL-SNAPSHOT" + compile "com.fr.third:fine-third:10.0-${MVN_BRANCH}-SNAPSHOT" compile fileTree(dir:"../../finereport-lib-other/${branchName}",include:'**/*.jar') testCompile 'junit:junit:4.12' } diff --git a/build.third_step3.gradle b/build.third_step3.gradle index 5e8ebc12a..702132f17 100644 --- a/build.third_step3.gradle +++ b/build.third_step3.gradle @@ -45,13 +45,14 @@ repositories{ FileTree files =fileTree(dir:'./',include:'build.*.gradle') def buildDir=files[0].path.substring(0,files[0].path.lastIndexOf (java.io.File.separator)) def branchName=buildDir.substring(buildDir.lastIndexOf (java.io.File.separator)+1) +def MVN_BRANCH = branchVariable.toUpperCase() //指定依赖 dependencies{ compile fileTree(dir:"${srcDir}/fine-jboss-logging/lib",include:'**/*.jar') compile fileTree(dir:"${srcDir}/build/libs/",include:'**/*.jar') // @branch - 分支信息 - compile "com.fr.third:fine-third:10.0-FINAL-SNAPSHOT" + compile "com.fr.third:fine-third:10.0-${MVN_BRANCH}-SNAPSHOT" compile fileTree(dir:"../../finereport-lib-other/${branchName}",include:'**/*.jar') testCompile 'junit:junit:4.12' } diff --git a/build.third_step4.gradle b/build.third_step4.gradle index 1ad793adc..650c69b0a 100644 --- a/build.third_step4.gradle +++ b/build.third_step4.gradle @@ -44,13 +44,14 @@ repositories{ FileTree files =fileTree(dir:'./',include:'build.*.gradle') def buildDir=files[0].path.substring(0,files[0].path.lastIndexOf (java.io.File.separator)) def branchName=buildDir.substring(buildDir.lastIndexOf (java.io.File.separator)+1) +def MVN_BRANCH = branchVariable.toUpperCase() //指定依赖 dependencies{ compile fileTree(dir:"${srcDir}/fine-hibernate/lib",include:'**/*.jar') compile fileTree(dir:"${srcDir}/build/libs/",include:'**/*.jar') // @branch - 分支信息 - compile "com.fr.third:fine-third:10.0-FINAL-SNAPSHOT" + compile "com.fr.third:fine-third:10.0-${MVN_BRANCH}-SNAPSHOT" compile fileTree(dir:"../../finereport-lib-other/${branchName}",include:'**/*.jar') testCompile 'junit:junit:4.12' } diff --git a/build.third_step5.gradle b/build.third_step5.gradle index 04a228994..dd8d80fdd 100644 --- a/build.third_step5.gradle +++ b/build.third_step5.gradle @@ -42,6 +42,7 @@ repositories{ FileTree files =fileTree(dir:'./',include:'build.*.gradle') def buildDir=files[0].path.substring(0,files[0].path.lastIndexOf (java.io.File.separator)) def branchName=buildDir.substring(buildDir.lastIndexOf (java.io.File.separator)+1) +def MVN_BRANCH = branchVariable.toUpperCase() //指定依赖 dependencies{ @@ -49,7 +50,7 @@ dependencies{ compile fileTree(dir:"${srcDir}/fine-druid/lib",include:'**/*.jar') compile fileTree(dir:"${srcDir}/build/libs/",include:'**/*.jar') // @branch - 分支信息 - compile "com.fr.third:fine-third:10.0-FINAL-SNAPSHOT" + compile "com.fr.third:fine-third:10.0-${MVN_BRANCH}-SNAPSHOT" compile fileTree(dir:"../../finereport-lib-other/${branchName}",include:'**/*.jar') testCompile 'junit:junit:4.12' } diff --git a/build.third_step6.gradle b/build.third_step6.gradle index 2062c7758..8ef6d50ae 100644 --- a/build.third_step6.gradle +++ b/build.third_step6.gradle @@ -68,6 +68,7 @@ repositories{ FileTree files =fileTree(dir:'./',include:'build*.gradle') def buildDir=files[0].path.substring(0,files[0].path.lastIndexOf (java.io.File.separator)) def branchName=buildDir.substring(buildDir.lastIndexOf (java.io.File.separator)+1) +def MVN_BRANCH = branchVariable.toUpperCase() //指定依赖 dependencies{ @@ -83,7 +84,7 @@ dependencies{ compile fileTree(dir:"${srcDir}/fine-jgit/lib",include:'**/*.jar') compile fileTree(dir:"${srcDir}/build/libs/",include:'**/*.jar') // @branch - 分支信息 - compile "com.fr.third:fine-third:10.0-FINAL-SNAPSHOT" + compile "com.fr.third:fine-third:10.0-${MVN_BRANCH}-SNAPSHOT" compile fileTree(dir:"../../finereport-lib-other/${branchName}",include:'**/*.jar') testCompile 'junit:junit:4.12' } diff --git a/fine-icu4j/src/com/fr/third/ibm/icu/text/RuleBasedBreakIterator.java b/fine-icu4j/src/com/fr/third/ibm/icu/text/RuleBasedBreakIterator.java index b202510ca..ce06a7f7f 100644 --- a/fine-icu4j/src/com/fr/third/ibm/icu/text/RuleBasedBreakIterator.java +++ b/fine-icu4j/src/com/fr/third/ibm/icu/text/RuleBasedBreakIterator.java @@ -17,6 +17,7 @@ import java.nio.ByteBuffer; import java.text.CharacterIterator; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.locks.ReentrantReadWriteLock; import com.fr.third.ibm.icu.impl.CharacterIteration; import com.fr.third.ibm.icu.impl.ICUBinary; @@ -43,8 +44,11 @@ public class RuleBasedBreakIterator extends BreakIterator { */ private RuleBasedBreakIterator() { fDictionaryCharCount = 0; - synchronized(gAllBreakEngines) { + try { + rLock.lock(); fBreakEngines = new ArrayList(gAllBreakEngines); + } finally { + rLock.unlock(); } } @@ -131,8 +135,11 @@ public class RuleBasedBreakIterator extends BreakIterator { if (fText != null) { result.fText = (CharacterIterator)(fText.clone()); } - synchronized (gAllBreakEngines) { + try { + rLock.lock(); result.fBreakEngines = new ArrayList(gAllBreakEngines); + } finally { + rLock.unlock(); } result.fLookAheadMatches = new LookAheadResults(); result.fBreakCache = result.new BreakCache(fBreakCache); @@ -294,10 +301,19 @@ public class RuleBasedBreakIterator extends BreakIterator { */ private static final List gAllBreakEngines; + private static final ReentrantReadWriteLock rwLock; + + private static final ReentrantReadWriteLock.ReadLock rLock; + + private static final ReentrantReadWriteLock.WriteLock wLock; + static { gUnhandledBreakEngine = new UnhandledBreakEngine(); gAllBreakEngines = new ArrayList(); gAllBreakEngines.add(gUnhandledBreakEngine); + rwLock = new ReentrantReadWriteLock(); + rLock = rwLock.readLock(); + wLock = rwLock.writeLock(); } /** @@ -663,7 +679,8 @@ public class RuleBasedBreakIterator extends BreakIterator { } } - synchronized (gAllBreakEngines) { + try { + wLock.lock(); // This break iterator's list of break engines didn't handle the character. // Check the global list, another break iterator may have instantiated the // desired engine. @@ -717,7 +734,10 @@ public class RuleBasedBreakIterator extends BreakIterator { fBreakEngines.add(eng); } return eng; - } // end synchronized(gAllBreakEngines) + // end synchronized(gAllBreakEngines) + } finally { + wLock.unlock(); + } } private static final int kMaxLookaheads = 8; diff --git a/fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfChunk.java b/fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfChunk.java index f5b67439a..8d014cd80 100644 --- a/fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfChunk.java +++ b/fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfChunk.java @@ -88,6 +88,12 @@ public class PdfChunk { private static final float FONT_SCALE = 100f; + private static final String BREAK = "\n"; + + private static final String BREAK_TAG = "
"; + + private boolean breakTag = false; + public float getHeight() { return height; } @@ -135,16 +141,16 @@ public class PdfChunk { keysNoStroke.put(Chunk.TEXTRENDERMODE, null); } - + // membervariables /** The value of this object. */ protected String value = PdfObject.NOTHING; - + /** The encoding. */ protected String encoding = BaseFont.WINANSI; - - + + /** The font for this PdfChunk. */ protected PdfFont font; @@ -164,7 +170,7 @@ public class PdfChunk { * such as underline. */ protected HashMap attributes = new HashMap(); - + /** * Non metric attributes. *

@@ -172,16 +178,16 @@ public class PdfChunk { * such as Color. */ protected HashMap noStroke = new HashMap(); - + /** true if the chunk split was cause by a newline. */ protected boolean newlineSplit; - + /** The image in this PdfChunk, if it has one */ protected Image image; - + /** The offset in the x direction for the image */ protected float offsetX; - + /** The offset in the y direction for the image */ protected float offsetY; @@ -189,17 +195,18 @@ public class PdfChunk { protected boolean changeLeading = false; // constructors - + /** * Constructs a PdfChunk-object. * * @param string the content of the PdfChunk-object * @param other Chunk with the same style you want for the new Chunk */ - + PdfChunk(String string, PdfChunk other) { thisChunk[0] = this; value = string; + updateBreakTag(); this.font = other.font; this.attributes = other.attributes; this.noStroke = other.noStroke; @@ -217,18 +224,18 @@ public class PdfChunk { splitCharacter = DefaultSplitCharacter.DEFAULT; this.height = other.getHeight(); } - -/** + + /** * Constructs a PdfChunk-object. * * @param chunk the original Chunk-object * @param action the PdfAction if the Chunk comes from an Anchor */ - + public PdfChunk(Chunk chunk, PdfAction action) { thisChunk[0] = this; value = chunk.getContent(); - + updateBreakTag(); Font f = chunk.getFont(); float size = f.getSize(); if (size == Font.UNDEFINED) @@ -302,15 +309,15 @@ public class PdfChunk { if (splitCharacter == null) splitCharacter = DefaultSplitCharacter.DEFAULT; } - + // methods - + /** Gets the Unicode equivalent to a CID. - * The (inexistent) CID is translated as '\n'. + * The (inexistent) CID is translated as '\n'. * It has only meaning with CJK fonts with Identity encoding. * @param c the CID code * @return the Unicode equivalent - */ + */ public int getUnicodeEquivalent(int c) { return c; } @@ -407,7 +414,7 @@ public class PdfChunk { * @param width a given width * @return the PdfChunk that doesn't fit into the width. */ - + PdfChunk truncate(float width) { if (image != null) { if (image.getScaledWidth() + indent.getLeft() + indent.getRight() > width) { @@ -421,10 +428,10 @@ public class PdfChunk { else return null; } - + int currentPosition = 0; float currentWidth = indent.getLeft(); - + // it's no use trying to split if there isn't even enough place for a space if (width < font.width() + indent.getLeft() + indent.getRight()) { String returnValue = value.substring(1); @@ -432,7 +439,7 @@ public class PdfChunk { PdfChunk pc = new PdfChunk(returnValue, this); return pc; } - + // loop over all the characters of a string // or until the totalWidth is reached int length = value.length(); @@ -451,12 +458,12 @@ public class PdfChunk { currentPosition++; currentPosition++; } - + // if all the characters fit in the total width, null is returned (there is no overflow) if (currentPosition == length) { return null; } - + // otherwise, the string has to be truncated //currentPosition -= 2; // we have to chop off minimum 1 character from the chunk @@ -470,49 +477,49 @@ public class PdfChunk { PdfChunk pc = new PdfChunk(returnValue, this); return pc; } - + // methods to retrieve the membervariables - + /** * Returns the font of this Chunk. * * @return a PdfFont */ - + PdfFont font() { return font; } - + /** * Returns the color of this Chunk. * * @return a Color */ - + Color color() { return (Color)noStroke.get(Chunk.COLOR); } - + /** * Returns the width of this PdfChunk. * * @return a width */ - + public float width() { return font.width(value) + indent.getLeft() + indent.getRight(); } - + /** * Checks if the PdfChunk split was caused by a newline. * @return true if the PdfChunk split was caused by a newline. */ - + public boolean isNewlineSplit() { return newlineSplit; } - + /** * Gets the width of the PdfChunk taking into account the * extra character and word spacing. @@ -520,7 +527,7 @@ public class PdfChunk { * @param wordSpacing the extra word spacing * @return the calculated width */ - + public float getWidthCorrected(float charSpacing, float wordSpacing) { if (image != null) { @@ -532,7 +539,7 @@ public class PdfChunk { ++numberOfSpaces; return width() + (value.length() * charSpacing + numberOfSpaces * wordSpacing); } - + /** * Gets the text displacement relative to the baseline. * @return a displacement in points @@ -544,7 +551,7 @@ public class PdfChunk { } return 0.0f; } - + /** * Trims the last space. * @return the width of the space trimmed, otherwise 0 @@ -565,44 +572,44 @@ public class PdfChunk { } return 0; } - + /** * Gets an attribute. The search is made in attributes * and noStroke. * @param name the attribute key * @return the attribute value or null if not found */ - + public Object getAttribute(String name) { if (attributes.containsKey(name)) return attributes.get(name); return noStroke.get(name); } - + /** *Checks if the attribute exists. * @param name the attribute key * @return true if the attribute exists */ - + boolean isAttribute(String name) { if (attributes.containsKey(name)) return true; return noStroke.containsKey(name); } - + /** * Checks if this PdfChunk needs some special metrics handling. * @return true if this PdfChunk needs some special metrics handling. */ - + boolean isStroked() { return (!attributes.isEmpty()); } - + /** * Checks if this PdfChunk is a Separator Chunk. * @return true if this chunk is a separator. @@ -611,7 +618,7 @@ public class PdfChunk { boolean isSeparator() { return isAttribute(Chunk.SEPARATOR); } - + /** * Checks if this PdfChunk is a horizontal Separator Chunk. * @return true if this chunk is a horizontal separator. @@ -624,7 +631,7 @@ public class PdfChunk { } return false; } - + /** * Checks if this PdfChunk is a tab Chunk. * @return true if this chunk is a separator. @@ -633,7 +640,7 @@ public class PdfChunk { boolean isTab() { return isAttribute(Chunk.TAB); } - + /** * Correction for the tab position based on the left starting position. * @param newValue the new value for the left X. @@ -645,72 +652,72 @@ public class PdfChunk { attributes.put(Chunk.TAB, new Object[]{o[0], o[1], o[2], new Float(newValue)}); } } - + /** * Checks if there is an image in the PdfChunk. * @return true if an image is present */ - + public boolean isImage() { return image != null; } - + /** * Gets the image in the PdfChunk. * @return the image or null */ - + public Image getImage() { return image; } - + /** * Sets the image offset in the x direction * @param offsetX the image offset in the x direction */ - + void setImageOffsetX(float offsetX) { this.offsetX = offsetX; } - + /** * Gets the image offset in the x direction * @return the image offset in the x direction */ - + float getImageOffsetX() { return offsetX; } - + /** * Sets the image offset in the y direction * @param offsetY the image offset in the y direction */ - + void setImageOffsetY(float offsetY) { this.offsetY = offsetY; } - + /** * Gets the image offset in the y direction * @return Gets the image offset in the y direction */ - + float getImageOffsetY() { return offsetY; } - + /** * sets the value. * @param value content of the Chunk */ - + void setValue(String value) { this.value = value; @@ -727,17 +734,17 @@ public class PdfChunk { * Tells you if this string is in Chinese, Japanese, Korean or Identity-H. * @return true if the Chunk has a special encoding */ - + boolean isSpecialEncoding() { return encoding.equals(CJKFont.CJK_ENCODING) || encoding.equals(BaseFont.IDENTITY_H); } - + /** * Gets the encoding of this string. * * @return a String */ - + String getEncoding() { return encoding; } @@ -745,7 +752,7 @@ public class PdfChunk { int length() { return value.length(); } - + int lengthUtf32() { if (!BaseFont.IDENTITY_H.equals(encoding)) return value.length(); @@ -758,17 +765,17 @@ public class PdfChunk { } return total; } - + boolean isExtSplitCharacter(int start, int current, int end, char[] cc, PdfChunk[] ck) { return splitCharacter.isSplitCharacter(start, current, end, cc, ck); } - + /** * Removes all the ' ' and '-'-characters on the right of a String. *

* @param string the String that has to be trimmed. * @return the trimmed String - */ + */ String trim(String string) { while (string.endsWith(" ") || string.endsWith("\t")) { string = string.substring(0, string.length() - 1); @@ -779,7 +786,7 @@ public class PdfChunk { public boolean changeLeading() { return changeLeading; } - + float getCharWidth(int c) { if (noPrint(c)) return 0; @@ -798,7 +805,7 @@ public class PdfChunk { htmlString.append(""); - htmlString.append(value); + htmlString.append(breakTag ? BREAK_TAG : value); htmlString.append(""); return htmlString.toString(); } @@ -856,4 +863,12 @@ public class PdfChunk { return indent.getLeft(); } + private void updateBreakTag() { + breakTag = BREAK.equals(value); + } + + public boolean isBreakTag() { + return breakTag; + } + } diff --git a/fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfLine.java b/fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfLine.java index 4752ffd8e..a4f980b3c 100644 --- a/fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfLine.java +++ b/fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfLine.java @@ -91,9 +91,11 @@ public class PdfLine { /** The original width. */ protected float originalWidth; - + protected boolean isRTL = false; + + public float getHeight() { return height; } @@ -155,9 +157,15 @@ public class PdfLine { public PdfChunk add(PdfChunk chunk) { // nothing happens if the chunk is null. if (chunk == null || chunk.toString().equals("")) { - return null; + return null; } - + // add to line if the chunk is break tag ("\n") + if (chunk.isBreakTag()) { + addToLine(chunk); + width = 0; + return null; + } + // we split the chunk to be added PdfChunk overflow = chunk.split(width); newlineSplit = (chunk.isNewlineSplit() || overflow == null);