How to traverse a B-Tree using Stack without recursion?
This is function to traverse Btree using Stack but it does not work
void StackTraverse( BTreeNode node01 ) {
Stack< BTreeNode > stack01 = new Stack< BTreeNode >();
stack01.push( node01 ); // first node "to check"
String string01 = "";
int i = 0;
while ( stack01.size() > 0 ) {
BTreeNode current = stack01.pop();
if ( current.leaf == false ) {// if node is valid
for ( i = 0; i < current.n; i++ ) {
string01 = string01 + "Node : " + current.keys[ i ] + " ";
// string01 = string01 + current.traverse();
stack01.push( current.nodeChild[ i ] );
}
arrayString.add( string01 );
string01 = "";
}
}
}
void StackTraverse() {
String s01 = "";
if ( root != null ) {
StackTraverse( root );
System.out
.println( "\n arrayString.size() = " + arrayString.size() );
for ( int i = 0; i < arrayString.size(); i++ ) {
s01 = arrayString.get( i );
System.out.println( s01 );
}
}
}
Related
I have an XML file shown below:
<Envelope>
<Body>
<user1>
<userId>userName</userId>
<password>password</password>
<creditCard>
<creditCardNumber>12345678901234</creditCardNumber>
<cvv>123</cvv>
</creditCard>
</user1>
<user2>
<userId>userName</userId>
<password>password</password>
<creditCard>
<creditCardNumber>12345678901234</creditCardNumber>
<cvv>123</cvv>
</creditCard>
</user2>
</Body>
</Envelope>
I have a java code used to log the xml transactions on to some server for future reference. This java code has methods to mask some characters or whole value of tag before logging as the credit card details are not to be disclosed.
Here are the methods:
public static String mask( String input, String[] tags, String maskPattern, String namespacePattern)
throws Throwable
{
StringBuffer sb = new StringBuffer( input );
encodedXML = false;
if (sb.indexOf( ">" ) > 0) {
// XML is encoded
gt = ">";
lt = "<";
encodedXML = true;
// modify patterns for encoded xml
maskPattern = "(>)" + alphaNumericStuff + "+(<)/";
if (sb.indexOf( """ ) >= 0) {
// There is a mix of double quotes and " in this xml
namespacePattern = mixedEncodingAlphaNumericStuff + "*";
}
}
for (int i = 0; i < tags.length; i++) {
// do a quick check to see if the tag is in the string to reduce excessive string creation
if (sb.indexOf( tags[i] ) < 0) {
continue;
} else {
sb = maskElementValue( sb, tags[i],maskPattern, namespacePattern );
}
}
return sb.toString();
}
private static StringBuffer maskElementValue( StringBuffer sb, String tag, String maskPattern,String namespacePattern)
{
// Pattern p = Pattern.compile( tag + maskPattern ); doesn't take namespace into account
Pattern p = Pattern.compile( tag + namespacePattern + maskPattern );
Matcher m = p.matcher( sb.toString() );
StringBuffer tempSB = new StringBuffer();
String namespaceStr = "";
while (m.find()) {
namespaceStr = m.group().substring( tag.length(), m.group().indexOf( gt ) );
// Added full masking for username and password including last 4 characters
if (tag.equalsIgnoreCase( "username" ) || tag.equalsIgnoreCase( "password" )) {
m.appendReplacement( tempSB, tag + namespaceStr + gt + xOut( new StringBuffer( m.group().substring( tag.length() + namespaceStr.length() + gt.length() ) ), true ) );
} else {
m.appendReplacement( tempSB, tag + namespaceStr + gt + xOut( new StringBuffer( m.group().substring( tag.length() + namespaceStr.length() + gt.length() ) ), false ) );
}
}
m.appendTail( tempSB );
return tempSB;
}
private static String xOut( StringBuffer sb, boolean maskAll )
{
int dataSize = sb.toString().trim().length() - 1 - lt.length();
if (!maskAll && dataSize > 4) {
if (sb.indexOf( "<" ) > 0 || sb.indexOf( "<" ) > 0) {
StringBuffer tempmaskSB = new StringBuffer( sb.substring( 0, sb.indexOf( "<" ) ) );
dataSize = tempmaskSB.length();
}
// Don't mask last 4 digit
for (int i = 0; i < dataSize - 4; i++) {
sb.setCharAt( i, 'X' );
}
} else {
if (sb.indexOf( "<" ) > 0 || sb.indexOf( "<" ) > 0) {
StringBuffer tempmaskSB = new StringBuffer( sb.substring( 0, sb.indexOf( "<" ) ) );
dataSize = tempmaskSB.length();
}
// Mask all
for (int i = 0; i < dataSize; i++) {
sb.setCharAt( i, 'X' );
}
}
return sb.toString();
}
I am passing the xml as string to the method and an array of tags that are to be masked. If it is username and password they should be masked completely and other tags in the array should be masked except the last 4 characters.
Now the problem is that masking is not happening for some of the transactions. when we have done a load testing, 12 out of 18000 transactions are not masked the protected data.
In some cases, user1 details are getting masked but user2 details are not masked in the same transaction.
Could any one help me in understanding why this is happening? Has anybody faced such issue before?
Thanks in advance.
Not sure if this is helpful. But i would do the masking part with jsoup
Example:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.parser.Parser;
import org.jsoup.select.Elements;
public class Mask {
static String xml = "<Envelope>\n" +
"<Body>\n" +
" <user1>\n" +
" <userId>userName</userId>\n" +
" <password>password</password>\n" +
" <creditCard>\n" +
" <creditCardNumber>12345678901234</creditCardNumber>\n" +
" <cvv>123</cvv>\n" +
" </creditCard>\n" +
" </user1>\n" +
" <user2>\n" +
" <userId>userName</userId>\n" +
" <password>password</password>\n" +
" <creditCard>\n" +
" <creditCardNumber>12345678901234</creditCardNumber>\n" +
" <cvv>123</cvv>\n" +
" </creditCard>\n" +
" </user2>\n" +
"</Body>\n" +
"</Envelope>";
public static void main (String[]args){
Document doc = Jsoup.parse(xml, "", Parser.xmlParser());
Elements toMaskCompletely = doc.select("userId,password");
Elements toMaskPartially = doc.select("creditCardNumber");
for(Element ele : toMaskCompletely){
ele.text("XXXXX");
}
for(Element ele : toMaskPartially){
ele.text("XXXXXXXX"+ele.text().substring(ele.text().length()-4));
}
System.out.println(doc.toString());
}
}
Closed. This question needs debugging details. It is not currently accepting answers.
Edit the question to include desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem. This will help others answer the question.
Closed 8 years ago.
Improve this question
I'm currently learning programming (java) and I've been using a program that runs on command prompt but as an exercise, I've been asked to run it on netbeans and to find out how it can work on it. When I run the program this is the output that I got.
run:
Please specify a path to a pricing catalogue file
Java Result: 3
BUILD SUCCESSFUL (total time: 0 seconds)
I've spent several hours on this issue but I was not able to sort it out. Can anybody help me with it please.
Here is the codes.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
public class Grocery {
private static Catalogue pricingCatalogue;
private static HashMap<String, Double> inputItemList = new HashMap<String, Double>();
private static ArrayList<PurchasedProduct> purchasedItemList;
public static void main(String[] args) {
if( args.length != 1 )
{
System.err.println( "" );
System.exit( 3 );
}
generateCatalogue( args[0] );
gatherUserInput();
rateItem();
printItemizedBill();
}
private static void generateCatalogue( String inputFile ) {
try {
List<String> lines = Files.readAllLines(
Paths.get(inputFile),
Charset.defaultCharset() );
pricingCatalogue = new Catalogue();
Boolean compareIgnoreCase = false;
for (String line : lines) {
StringTokenizer token = new StringTokenizer( line, "|" );
String productName = (String)token.nextElement();
String rateName = (String)token.nextElement();
String rateDescr = (String)token.nextElement();
Double effectiveQuantity = new Double( (String)token.nextElement() );
Double effectivePrice;
String tierPrice;
Rate newRate;
Product newProduct;
if( effectiveQuantity == -1 )
{
tierPrice = (String)token.nextElement();
newRate = new Rate( rateName, rateDescr, tierPrice );
}
else
{
effectivePrice = new Double( (String)token.nextElement() );
newRate = new Rate( rateName, rateDescr, effectiveQuantity, effectivePrice );
}
if( true == pricingCatalogue.productIsInCatalogue( productName, compareIgnoreCase ) )
{
pricingCatalogue.addRateToExistingProduct( productName, newRate );
}
else
{
newProduct = new Product( productName );
newProduct.addRate( newRate );
pricingCatalogue.addProduct( newProduct );
}
} // end reading input file
}
catch (IOException e) {
e.printStackTrace();
}
//pricingCatalogue.printCatalogue();
System.out.println( "Price catalogue loaded sucessfully from [" + inputFile + "]\n" );
}
private static void gatherUserInput()
{
BufferedReader br = new BufferedReader(new InputStreamReader( System.in ) );
String inStr = new String();
String magicWord = "CHECK OUT";
Boolean readyToCheckOut = false;
Boolean compareIgnoreCase = false;
StringTokenizer item_tok = null;
String tok = null;
String itemName = new String();
Double itemQuantity = new Double( 0 );
inputItemList.clear();
System.out.println( "Please enter an item with quantity in a format like '2 apple'" );
System.out.println( "When you are done entering item(s), type 'CHECK OUT' to get an itemized bill" );
while( false == readyToCheckOut )
{
System.out.print( ">> ");
try {
inStr = br.readLine();
}catch( IOException ioe ) {
System.err.println("Failed to read line item");
}
item_tok = new StringTokenizer( inStr );
while( false == inStr.equals( magicWord )
&&
true == item_tok.hasMoreTokens() )
{
try
{
tok = item_tok.nextElement().toString();
itemQuantity = new Double( tok );
tok = item_tok.nextElement().toString();
}
catch( NumberFormatException nfe )
{
System.err.println( "[" + tok + "] is not something I recognize. Try something like '2 apple'" );
break;
}
catch( Exception e )
{
System.err.println( "Oops I did not understand that. Try something like '2 apple'" );
break;
}
itemName = tok;
//System.out.println( "--- ITEM [" + itemName + "] QUANTITY [" + ItemQuantity + "]" );
if( false == pricingCatalogue.productIsInCatalogue( itemName, compareIgnoreCase ) )
{
System.err.println( "Item [" + itemName + "] does not exist in the catalogue" );
continue;
}
if( true == inputItemList.containsKey( itemName ) ) {
itemQuantity = itemQuantity + inputItemList.get( itemName );
inputItemList.remove( itemName );
inputItemList.put( itemName, itemQuantity );
}
else {
inputItemList.put( itemName, itemQuantity );
}
}
if( true == inStr.equals( magicWord ) ) {
readyToCheckOut = true;
}
}
//System.out.println( "inputItemList [" + inputItemList + "]" );
}
private static void rateItem()
{
purchasedItemList = new ArrayList<PurchasedProduct>();
Product aProduct;
Rate bestRate;
PurchasedProduct pp;
double purchasedQuantity = 0;
for( Map.Entry<String, Double> entry : inputItemList.entrySet() )
{
String prodName = entry.getKey();
Double prodQuantity = entry.getValue();
aProduct = pricingCatalogue.getProduct( prodName );
bestRate = aProduct.getBestRate( prodQuantity );
purchasedQuantity = bestRate.getEffectiveQuantity();
pp = new PurchasedProduct( prodName, purchasedQuantity, bestRate );
purchasedItemList.add( pp );
prodQuantity = prodQuantity - purchasedQuantity;
/*
* Keep finding the best rate for the same product until we
* have filled the quantity
*/
while( prodQuantity > 0 )
{
bestRate = aProduct.getBestRate( prodQuantity );
purchasedQuantity = bestRate.getEffectiveQuantity();
pp = new PurchasedProduct( prodName, purchasedQuantity, bestRate );
purchasedItemList.add( pp );
prodQuantity = prodQuantity - purchasedQuantity;
}
}
}
private static void printItemizedBill()
{
PurchasedProduct pp = null;
Double totalDue = new Double( 0 );
Double lineTotal = new Double( 0 );
System.out.println( "\nHere is your invoice:" );
Iterator ite = purchasedItemList.iterator();
while( ite.hasNext() )
{
pp = (PurchasedProduct)ite.next();
lineTotal = pp.getPurhcasedCost();
System.out.format( "%10s%20s%10.2f\n", pp.getPurchasedProductName(), pp.getPurchasedRateDescr(), lineTotal );
totalDue += lineTotal;
}
System.out.format( "\n%10s%20s$%9.2f\n", "TOTAL DUE", "", totalDue );
}
}
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
public class Catalogue
{
private ArrayList<Product> productList;
Catalogue()
{
this.productList = new ArrayList<Product>();
}
/*
* Returns a boolean if a product exists in the catalogue. Use the second
* argument to set whether the comparsion should take case-sensitivity into accoun
*
*/
public boolean productIsInCatalogue( String inProdName, Boolean compareIgnoreCase )
{
HashSet<String> currentProductSet = new HashSet<String>();
/*
* Get list of pricing product names
*/
Iterator ite = this.productList.iterator();
while( ite.hasNext() )
{
if( true == compareIgnoreCase )
{
currentProductSet.add( ( (Product)ite.next() ).getProductName().toUpperCase() );
}
else
{
currentProductSet.add( ( (Product)ite.next() ).getProductName() );
}
}
if( true == compareIgnoreCase )
{
return currentProductSet.contains( inProdName.toUpperCase() );
}
else
{
return currentProductSet.contains( inProdName );
}
}
public void addProduct( Product inProduct )
{
this.productList.add( inProduct );
}
public void addRateToExistingProduct( String inExistingProdName, Rate inRate )
{
Iterator ite = this.productList.iterator();
while( ite.hasNext() )
{
Product currentProd = (Product)ite.next();
String currentProdName = currentProd.getProductName();
if( 0 == currentProdName.compareTo( inExistingProdName ) )
{
currentProd.addRate( inRate );
break;
}
}
}
public Product getProduct( String inExistingProdName )
{
Product foundProduct = null;
Iterator ite = this.productList.iterator();
while( ite.hasNext() )
{
Product aProduct = (Product)ite.next();
if( true == aProduct.getProductName().equals( inExistingProdName ) )
{
foundProduct = aProduct;
break;
}
}
return foundProduct;
}
public void printCatalogue()
{
Iterator ite = this.productList.iterator();
while( ite.hasNext() )
{
( (Product)ite.next() ).printProduct();
}
}
}
import java.util.HashSet;
import java.util.Iterator;
public class Product
{
private String productName;
private HashSet <Rate> productRate;
Product()
{
this( "N/A" );
}
Product( String inProductName )
{
this.productName = inProductName;
this.productRate = new HashSet <Rate>();
}
/*
* Add a rate to this product
*/
public void addRate( Rate inRate )
{
this.productRate.add( inRate );
}
public void printProduct()
{
System.out.println( "*** PRODUCT NAME [" + this.productName + "] ***\n" );
if( this.productRate.size() > 0 )
{
Iterator ite = this.productRate.iterator();
while( ite.hasNext() )
{
((Rate)ite.next()).printRate();
}
}
else
{
System.out.println( "This product does not have rates defined");
}
System.out.println( "" );
}
public String getProductName()
{
return this.productName;
}
public Rate getBestRate( Double inQuantity )
{
Rate lowestRate = null;
HashSet <Rate> applicableRate = new HashSet <Rate>();
Iterator ite = this.productRate.iterator();
while( ite.hasNext() )
{
Rate aRate = (Rate)ite.next();
if( inQuantity >= aRate.getEffectiveQuantity() )
{
applicableRate.add( aRate );
}
}
/*
* Amongst the available rates, pick the rate with
* the lowest cost per unit
*/
ite = applicableRate.iterator();
while( ite.hasNext() )
{
Rate appRate = (Rate)ite.next();
if( null == lowestRate )
{
/*
* Handle first time entering the loop
*/
lowestRate = appRate;
}
if( lowestRate.getCostPerUnit() > appRate.getCostPerUnit() )
{
lowestRate = appRate;
}
}
return lowestRate;
}
}
import java.math.BigDecimal;
import java.math.RoundingMode;
public class PurchasedProduct
{
private String purchasedProdName;
private double purchasedQuantity;
private Rate purchasedRate;
private double purchasedCost;
PurchasedProduct( String inProdName, double inQuantity, Rate inRate )
{
//this.purchasedProdName = Character.toUpperCase( inProdName.charAt(0) ) + inProdName.substring( 1 );
this.purchasedProdName = inProdName;
this.purchasedQuantity = inQuantity;
this.purchasedRate = inRate;
this.purchasedCost = this.getCost();
}
public String getPurchasedProductName()
{
return this.purchasedProdName;
}
public String getPurchasedRateDescr()
{
return this.purchasedRate.getRateDescr();
}
public double getPurhcasedCost()
{
return this.purchasedCost;
}
private double getCost()
{
double lineCost = 0;
if( false == this.purchasedRate.isTiered() )
{
lineCost = this.purchasedRate.getEffectivePrice();
}
else
{
lineCost = this.purchasedRate.getTierPrice( new Double( this.purchasedQuantity ) );
}
return round( lineCost, 2 );
}
private double round( double value, int places )
{
if (places < 0) throw new IllegalArgumentException();
BigDecimal bd = new BigDecimal(value);
bd = bd.setScale(places, RoundingMode.HALF_UP);
return bd.doubleValue();
}
}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.StringTokenizer;
/*
* Rate class represents the detail on how to rate a specific product
* A product may have many rates
*/
public class Rate
{
private String rateName;
private String rateDescr; // bill invoice display
private double effectiveQuantity; // the total quantity applicable to take advantage of this rate
private double effectivePrice; // the total price applicable
private double costPerUnit; // average cost per unit
private ArrayList<Map> tiers; // ONLY applicable if this is tierd pricing
Rate()
{
this( "N/A", "N/A", 0, 0 );
}
/*
* Non-tier rate constructor
*/
Rate( String inRateName, String inRateDesc, double inEffQ, double inEffPr )
{
this.rateName = inRateName;
this.rateDescr = inRateDesc;
this.effectiveQuantity = inEffQ;
this.effectivePrice = inEffPr;
this.tiers = new ArrayList<Map>();
this.costPerUnit = this.getCostPerUnit();
}
/*
* Tier rate constructor
*/
Rate( String inRateName, String inRateDesc, String tier_val )
{
this.rateName = inRateName;
this.rateDescr = inRateDesc;
this.effectiveQuantity = -1; // this is calculated later in getCostPerUnit
this.effectivePrice = -1;
this.tiers = new ArrayList<Map>();
/*
* Example tier_val "1-1,0.50,1;2-2,0.50,0.50"
* Each tier is separated by ';'
* A token within a tier is operated by ','
*/
StringTokenizer more_tiers = new StringTokenizer( tier_val, ";" );
while( more_tiers.hasMoreTokens() )
{
StringTokenizer tier_detail = new StringTokenizer( (String)more_tiers.nextElement(), "," );
Map<String, Double> tier_map = new HashMap<String, Double>();
/*
* First token is the min to max quantity e.g. 1-1 or 1-5
*/
String[] minMaxVal = tier_detail.nextElement().toString().split("-");
tier_map.put( "MIN", new Double( minMaxVal[0] ) );
tier_map.put( "MAX", new Double( minMaxVal[1] ) );
/*
* Second token is the quantity price per unit so 1.50 mean charge each unit for 1.50
*/
tier_map.put( "PRICE", new Double( (String)tier_detail.nextElement() ) );
/*
* Third token is the discount scale, e.g 1 means 100% no discount and 0.5 means 50% discount
*/
tier_map.put( "SCALE", new Double( (String)tier_detail.nextElement() ) );
tiers.add( tier_map );
}
this.costPerUnit = this.getCostPerUnit();
}
public String getRateDescr()
{
return this.rateDescr;
}
public double getEffectiveQuantity()
{
return this.effectiveQuantity;
}
public double getEffectivePrice()
{
return this.effectivePrice;
}
public Boolean isTiered()
{
return ( this.effectivePrice == -1 );
}
/*
* Calculate the total cost with the input quantity
*/
public double getTierPrice( double inQuantity )
{
Iterator ite = this.tiers.iterator();
Double min = new Double( 0 );
Double max = new Double( 0 );
Double price = new Double( 0 );
Double scale = new Double( 0 );
Double total_cost = new Double( 0 );
Double total_quan = new Double( 0 );
Double tierMaxQ = new Double( 0 );
Double toRateQuan = new Double( inQuantity );
/*
* Step through each tier
*/
while( ite.hasNext() )
{
Map tier_map = (Map)ite.next();
min = (Double)tier_map.get( "MIN" );
max = (Double)tier_map.get( "MAX" );
price = (Double)tier_map.get( "PRICE" );
scale = (Double)tier_map.get( "SCALE" );
/*
* Get the tier applicable units
*/
tierMaxQ = max - min + 1;
if( 0 >= toRateQuan )
{
break;
}
else if( toRateQuan >= tierMaxQ )
{
/*
* The incoming to-to-rated quantity is greater than
* the tier total units. Rate it with the
* maximum units in this tier
*/
total_cost = total_cost + ( tierMaxQ * price * scale );
toRateQuan = toRateQuan - tierMaxQ;
continue;
}
else
{
/*
* The incoming to-be-rated quantity is less than
* the tier total units. Rate it with the to-be-rated
* quantity
*/
total_cost = total_cost + ( toRateQuan * price * scale );
break;
}
}
return total_cost;
}
/*
* Calculate the 'average' cost per unit
*
* For a non-tiered rate, the average cost is price over quantity
*
* For a tiered rate, we calculate each tier cost, add them up and
* divide by the total quantity to get the average cost
*
*/
public double getCostPerUnit()
{
if( false == this.isTiered() )
{
/*
* Simple pricing; individual or bulk
*/
return ( this.effectivePrice / this.effectiveQuantity );
}
else
{
/*
* Tier pricing. Calculate the total cost then divide by the quantity to
* get the average cost
*/
Iterator ite = this.tiers.iterator();
Double min = new Double( 0 );
Double max = new Double( 0 );
Double price = new Double( 0 );
Double scale = new Double( 0 );
Double total_cost = new Double( 0 );
Double total_quan = new Double( 0 );
Double costPerUnit = new Double( 0 );
while( ite.hasNext() )
{
Map tier_map = (Map)ite.next();
min = (Double)tier_map.get( "MIN" );
max = (Double)tier_map.get( "MAX" );
price = (Double)tier_map.get( "PRICE" );
scale = (Double)tier_map.get( "SCALE" );
if( 0 >= ( max - min + 1 ) )
{
break;
}
total_quan = total_quan + ( max - min + 1 );
total_cost = total_cost + ( ( max - min + 1 ) * price * scale );
}
this.effectiveQuantity = total_quan;
costPerUnit = total_cost / total_quan;
return costPerUnit;
}
}
/*
* DEBUG
*/
public void printRate()
{
System.out.println( "\tRATE NAME [" + this.rateName + "]" );
System.out.println( "\tRATE DESC [" + this.rateDescr + "]" );
System.out.println( "\tQUANTITY [" + this.effectiveQuantity + "]" );
System.out.println( "\tCOST PER UNIT [" + this.costPerUnit + "]" );
if( false == this.isTiered() )
{
System.out.println( "\tPRICE [" + this.effectivePrice + "]" );
}
else
{
int num_tiers = this.tiers.size();
for( int i = 0; i < num_tiers; ++i )
{
System.out.println( "\t--- TIER [" + ( i + 1 ) + "]" );
System.out.println( "\t\t --- MIN [" + this.tiers.get( i ).get( "MIN") + "]" );
System.out.println( "\t\t --- MAX [" + this.tiers.get( i ).get( "MAX") + "]" );
System.out.println( "\t\t --- PRICE [" + this.tiers.get( i ).get( "PRICE") + "]" );
System.out.println( "\t\t --- SCALE [" + this.tiers.get( i ).get( "SCALE") + "]" );
}
}
System.out.println( "\n\n");
}
}
This
System.exit( 3 );
Causes your process to return (in Java parlance it exits) with a value to the operating system. It's equivalent to the int returned by main in c and c++. On unix style systems you can access the return value with
echo $?
It looks like you are supposed to call this program with a file-path to some catalogue as the first argument (args[0]), otherwise it exits.
I inherited a Play 1.2.4 application which has just been security audited. It seems some methods are unsafe so I need to change them to use prepared statements.
One of the methods in question is this:
public static void surveys(int startIndex, int endIndex, boolean isAscending, String orderBy, String searchField,
String searchText, String filter) {
NdgUser currentUser = NdgUser.find("byUserName", session.get("ndgUser")).first();
NdgUser currentUserAdmin = NdgUser.find("byUserName", currentUser.userAdmin).first();
List<Survey> surveys = null;
String query;
if (filter != null && filter.length() > 0) {
query = getQuery2Filters( "available" , String.valueOf( SurveyStatusConsts.getStatusFlag( filter ) ),
"ndg_user_id", String.valueOf(currentUserAdmin.getId()), false,
searchField, searchText, null, isAscending );//sorting is not needed now
}
else {
query = getQuery( "ndg_user_id" , String.valueOf(currentUserAdmin.getId()), false,
searchField, searchText, null, isAscending );//sorting is not needed now
}
long totalItems = 0;
totalItems = Survey.count( query );
if ( orderBy != null && orderBy.equals( "resultCollection" ) ) {
surveys = Survey.find( query ).fetch();
Collections.sort( surveys, new SurveyNdgResultCollectionComapator() );
if ( !isAscending ) {
Collections.reverse( surveys );
}
int subListEndIndex = surveys.size() <= endIndex ? surveys.size() : endIndex;
surveys = surveys.subList( startIndex, subListEndIndex );
} else {
if (filter != null && filter.length() > 0) {
query = getQuery2Filters( "available", String.valueOf( SurveyStatusConsts.getStatusFlag( filter ) ),
"ndg_user_id", String.valueOf(currentUserAdmin.getId()), false,
searchField, searchText, orderBy, isAscending );
}
else {
query = getQuery( "ndg_user_id", String.valueOf(currentUserAdmin.getId()), false,
searchField, searchText, orderBy, isAscending );
}
surveys = Survey.find( query ).from( startIndex ).fetch( endIndex - startIndex );
}
serializeSurveys(surveys, startIndex, totalItems);
}
which makes use of another couple of methods to actually build the query
private static String getQuery(String filterName, String filterValue, boolean isFilterString, String searchField,
String searchText, String orderBy, boolean isAscending ) {
StringBuilder query = new StringBuilder();
String statusQuery = "";
String searchQuery = "";
String sortingQuery = "";
if ( filterName != null && filterName.length() > 0
&& filterValue != null && filterValue.length() > 0 ) {
statusQuery = filterName + "=" + ( isFilterString ? ("'" + filterValue + "'") : filterValue );
}
if ( searchField != null && searchText != null && searchText.length() > 0 ) {
if(searchField.equals("dateSent")) {
searchQuery = "DATE_FORMAT(" + searchField + ", '%d/%m/%Y')" + " like '%" + searchText + "%'";
}
else {
searchQuery = searchField + " like '%" + searchText + "%'";
}
}
if ( orderBy != null && orderBy.length()> 0 ) {
sortingQuery = "order by " + orderBy + ( isAscending ? " asc" : " desc" );
}
query.append( statusQuery )
.append( ( statusQuery.length() > 0 && searchQuery.length() > 0 ) ? " and " : ' ' )
.append( searchQuery )
.append( ' ' )
.append( sortingQuery );
return query.toString();
}
and
private static String getQuery2Filters(String filterName, String filterValue, String filterName2,
String filterValue2, boolean isFilterString, String searchField,
String searchText, String orderBy, boolean isAscending ) {
StringBuilder query = new StringBuilder();
String statusQuery = "";
String searchQuery = "";
String sortingQuery = "";
if ( filterName != null && filterName.length() > 0
&& filterValue != null && filterValue.length() > 0 ) {
statusQuery = filterName + "=" + ( isFilterString ? ("'" + filterValue + "'") : filterValue );
}
if ( filterName2 != null && filterName2.length() > 0
&& filterValue2 != null && filterValue2.length() > 0 ) {
statusQuery += " and " + filterName2 + "="
+ ( isFilterString ? ("'" + filterValue2 + "'") : filterValue2 );
}
if ( searchField != null && searchText != null && searchText.length() > 0 ) {
searchQuery = searchField + " like '%" + searchText + "%'";
}
if ( orderBy != null && orderBy.length()> 0 ) {
sortingQuery = "order by " + orderBy + ( isAscending ? " asc" : " desc" );
}
query.append( statusQuery )
.append( ( statusQuery.length() > 0 && searchQuery.length() > 0 ) ? " and " : ' ' )
.append( searchQuery )
.append( ' ' )
.append( sortingQuery );
return query.toString();
}
I believe it is these auxiliary methods I need to change for basic string concatenation to something using parameters but I am a bit lost as to how actually do that. I am not very familar with either Java or Hibernate/JPA so some pointers gratefully received
I am using docx4j to manipulate docx. What im trying to do is make buffered image of every image in all tables. I have instance of org.docx4j.wml.Drawing, is there any way to make buffered image from it?
Source codes are mostly downloaded from somewhere.
Only relevant parts:
for (Object o : children ) {
System.out.println(" " + o.getClass().getName() );
if ( o instanceof javax.xml.bind.JAXBElement) {
System.out.println(" " + ((JAXBElement)o).getName() );
System.out.println(" " + ((JAXBElement)o).getDeclaredType().getName());
// TODO - unmarshall directly to Text.
if ( ((JAXBElement)o).getDeclaredType().getName().equals("org.docx4j.wml.Text") ) {
org.docx4j.wml.Text t = (org.docx4j.wml.Text)((JAXBElement)o).getValue();
System.out.println(" " + t.getValue() );
} else if ( ((JAXBElement)o).getDeclaredType().getName().equals("org.docx4j.wml.Drawing") ) {
org.docx4j.wml.Drawing d = (org.docx4j.wml.Drawing)((JAXBElement)o).getValue();
describeDrawing(d);
}
this will basically go thru cells in table and determine wherther its a text or a picture
I want to make bufferedimages from pictures.
Complete source codes:
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import org.docx4j.dml.picture.Pic;
import org.docx4j.dml.wordprocessingDrawing.Anchor;
import org.docx4j.dml.wordprocessingDrawing.Inline;
import org.docx4j.openpackaging.io.SaveToZipFile;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.wml.Body;
public class Test {
public static JAXBContext context = org.docx4j.jaxb.Context.jc;
/**
* #param args
*/
private static WordprocessingMLPackage wordMLPackage;
public static void main(String[] args) throws Exception {
//String inputfilepath = "/home/dev/workspace/docx4j/sample-docs/jpeg.docx";
String inputfilepath = "C:\\Users\\Blizzard\\Desktop\\VSE\\15.docx";
boolean save = false;
String outputfilepath = "C:\\Users\\Blizzard\\Desktop\\VSE\\112.docx";
// Open a document from the file system
// 1. Load the Package
wordMLPackage = WordprocessingMLPackage.load(new java.io.File(inputfilepath));
// 2. Fetch the document part
MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();
// Display its contents
System.out.println( "\n\n OUTPUT " );
System.out.println( "====== \n\n " );
org.docx4j.wml.Document wmlDocumentEl = (org.docx4j.wml.Document)documentPart.getJaxbElement();
Body body = wmlDocumentEl.getBody();
List <Object> bodyChildren = body.getEGBlockLevelElts();
walkJAXBElements(bodyChildren);
// Save it
if (save) {
SaveToZipFile saver = new SaveToZipFile(wordMLPackage);
saver.save(outputfilepath);
}
}
static void walkJAXBElements(List <Object> bodyChildren){
for (Object o : bodyChildren ) {
if ( o instanceof javax.xml.bind.JAXBElement) {
System.out.println( o.getClass().getName() );
System.out.println( ((JAXBElement)o).getName() );
System.out.println( ((JAXBElement)o).getDeclaredType().getName() + "\n\n");
if ( ((JAXBElement)o).getDeclaredType().getName().equals("org.docx4j.wml.Tbl") ) {
org.docx4j.wml.Tbl tbl = (org.docx4j.wml.Tbl)((JAXBElement)o).getValue();
describeTable(tbl);
}
} else if (o instanceof org.docx4j.wml.P) {
System.out.println( "Paragraph object: ");
if (((org.docx4j.wml.P)o).getPPr() != null
&& ((org.docx4j.wml.P)o).getPPr().getRPr() != null
&& ((org.docx4j.wml.P)o).getPPr().getRPr().getB() !=null) {
System.out.println( "For a ParaRPr bold!");
}
walkList( ((org.docx4j.wml.P)o).getParagraphContent());
}
}
}
static void walkList(List children){
for (Object o : children ) {
System.out.println(" " + o.getClass().getName() );
if ( o instanceof javax.xml.bind.JAXBElement) {
System.out.println(" " + ((JAXBElement)o).getName() );
System.out.println(" " + ((JAXBElement)o).getDeclaredType().getName());
// TODO - unmarshall directly to Text.
if ( ((JAXBElement)o).getDeclaredType().getName().equals("org.docx4j.wml.Text") ) {
org.docx4j.wml.Text t = (org.docx4j.wml.Text)((JAXBElement)o).getValue();
System.out.println(" " + t.getValue() );
} else if ( ((JAXBElement)o).getDeclaredType().getName().equals("org.docx4j.wml.Drawing") ) {
org.docx4j.wml.Drawing d = (org.docx4j.wml.Drawing)((JAXBElement)o).getValue();
String relation = describeDrawing(d);
}
} else if (o instanceof org.w3c.dom.Node) {
System.out.println(" IGNORED " + ((org.w3c.dom.Node)o).getNodeName() );
} else if ( o instanceof org.docx4j.wml.R) {
org.docx4j.wml.R run = (org.docx4j.wml.R)o;
if (run.getRPr()!=null) {
System.out.println(" " + "Properties...");
if (run.getRPr().getB()!=null) {
System.out.println(" " + "B not null ");
System.out.println(" " + "--> " + run.getRPr().getB().isVal() );
} else {
System.out.println(" " + "B null.");
}
}
walkList(run.getRunContent());
} else {
System.out.println(" IGNORED " + o.getClass().getName() );
}
// else if ( o instanceof org.docx4j.jaxb.document.Text) {
// org.docx4j.jaxb.document.Text t = (org.docx4j.jaxb.document.Text)o;
// System.out.println(" " + t.getValue() );
// }
}
}
static void describeTable( org.docx4j.wml.Tbl tbl ) {
// What does a table look like?
boolean suppressDeclaration = false;
boolean prettyprint = true;
System.out.println( org.docx4j.XmlUtils.marshaltoString(tbl, suppressDeclaration, prettyprint) );
// Could get the TblPr if we wanted them
org.docx4j.wml.TblPr tblPr = tbl.getTblPr();
// Could get the TblGrid if we wanted it
org.docx4j.wml.TblGrid tblGrid = tbl.getTblGrid();
// But here, let's look at the table contents
for (Object o : tbl.getEGContentRowContent() ) {
if (o instanceof org.docx4j.wml.Tr) {
org.docx4j.wml.Tr tr = (org.docx4j.wml.Tr)o;
for (Object o2 : tr.getEGContentCellContent() ) {
System.out.println(" " + o2.getClass().getName() );
if ( o2 instanceof javax.xml.bind.JAXBElement) {
if ( ((JAXBElement)o2).getDeclaredType().getName().equals("org.docx4j.wml.Tc") ) {
org.docx4j.wml.Tc tc = (org.docx4j.wml.Tc)((JAXBElement)o2).getValue();
// Look at the paragraphs in the tc
walkJAXBElements( tc.getEGBlockLevelElts() );
}
else {
// What is it, if it isn't a Tc?
System.out.println(" " + ((JAXBElement)o).getName() );
System.out.println(" " + ((JAXBElement)o).getDeclaredType().getName());
}
} else {
System.out.println("A " + o.getClass().getName() );
}
}
} else {
System.out.println("C " + o.getClass().getName() );
}
}
}
static String describeDrawing( org.docx4j.wml.Drawing d ) {
System.out.println(" describeDrawing " );
String vrat = null;
if ( d.getAnchorOrInline().get(0) instanceof Anchor ) {
System.out.println(" ENCOUNTERED w:drawing/wp:anchor " );
// That's all for now...
} else if ( d.getAnchorOrInline().get(0) instanceof Inline ) {
// Extract w:drawing/wp:inline/a:graphic/a:graphicData/pic:pic/pic:blipFill/a:blip/#r:embed
Inline inline = (Inline )d.getAnchorOrInline().get(0);
Pic pic = inline.getGraphic().getGraphicData().getPic();
//pic.
vrat = pic.getNvPicPr().getCNvPr().getName();
System.out.println( "image name: " + vrat);
//bordel(inline);
} else {
System.out.println(" Didn't get Inline :( How to handle " + d.getAnchorOrInline().get(0).getClass().getName() );
}
return vrat;
}
}
I tried adding some methods and im getting rly desperate:
private static void bordel(org.docx4j.wml.Drawing d){
MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();
RelationshipsPart relsPart = documentPart.getRelationshipsPart();
Relationships rels = relsPart.getRelationships();
List<Relationship> relsList = rels.getRelationship();
for (Relationship r : relsList) {
JAXBElement el = printInfo(relsPart.getPart(r));
if (el != null) {
if ( el.getDeclaredType().getName().equals("org.docx4j.wml.Drawing") ) {
org.docx4j.wml.Drawing c = (org.docx4j.wml.Drawing) el.getValue();
if (c.equals(d)){
System.out.println( "I found part");
}
}
}
}
}
this method is called on every image in cell and attemps to find Part which i believe i can convert to bufferedimage
but next method converting Part to JAXBElement always returns null
public static JAXBElement printInfo(Part p) {
JAXBElement el = null;
if (p instanceof JaxbXmlPart) {
Object o = ((JaxbXmlPart)p).getJaxbElement();
if (o instanceof javax.xml.bind.JAXBElement) {
//sb.append(" containing JaxbElement:" + XmlUtils.JAXBElementDebug((JAXBElement)o) );
el= (JAXBElement) o;
} else {
//sb.append(" containing JaxbElement:" + o.getClass().getName() );
}
}
return el;
}
The following code will find the image relationships for you:
BlipFinder bf = new BlipFinder();
new TraversalUtil(paragraphs, bf);
for (CTBlip imageReference : bf.blips) {
if (imageReference.getLink() != null
&& !imageReference.getLink().equals("")) {
Relationship existingRel = docxPkg.getMainDocumentPart()
.getRelationshipsPart().getRelationshipByID(
imageReference.getLink());
:
} else if (imageReference.getEmbed() != null) {
String relId = imageReference.getEmbed();
Relationship r = docxPkg.getMainDocumentPart().getRelationshipsPart().getRelationshipByID(relId);
if (r.getTargetMode()!=null
&& r.getTargetMode().toLowerCase().equals("external")) {
:
} else {
BinaryPartAbstractImage oldPart = (BinaryPartAbstractImage)docxPkg.getMainDocumentPart().getRelationshipsPart().getPart(relId);
:
}
} else {
log.error("HELP! neither linked nor embedded?");
}
}
}
static class BlipFinder extends CallbackImpl {
List<CTBlip> blips = new ArrayList<CTBlip>();
#Override
public List<Object> apply(Object o) {
if (o instanceof CTBlip)
blips.add((CTBlip)o);
return null;
}
and in the indicated case, give you a BinaryPartAbstractImage. Once you have that, you can do whatever you like...
package javaapplication1;
import java.io.*;
/**
*
* #author simon
*/
public class Main {
/**
* #param args the command line arguments
*/
public static void main(String[] args) throws IOException {
NotSimple[] objArray;
BufferedReader stdin = new BufferedReader(
new InputStreamReader( System.in ) );
System.out.println( "Enter a number of objects:" );
int size;
size = Integer.parseInt( stdin.readLine() );
//Initialize objArray
objArray = new NotSimple[size];
//TODO: Implement following functions
initializeObj(objArray);
increaseData(objArray);
printObjData(objArray);
//TODO: Explain all outputs of the below function
explainOutputs();
return;
}
//TODO
//initialize every Notsimple object in the array 'a'
//to NotSimple()
//Hint: using the for loop, assign a[i] = new NotSimple();
static void initializeObj(NotSimple[] a){
//TODO: FILL ME
for (int i = 0; i < a.length; i++)
{
a[i] = new NotSimple();
}
}
//TODO:
//Increase the ‘data’ member of every NotSimple object
//in the array ‘a’ by 1
static void increaseData(NotSimple[] a) {
//TODO: FILL ME
for (int i = 0; i < a.length; i++)
{
a[i].setData(a[i].getData()+1);
}
}
//TODO:
//Print the data of every NotSimple object in the array ‘a’
static void printObjData(NotSimple[] a) {
//TODO: FILL ME
for (int i = 0; i < a.length; i++)
{
System.out.println (a[i].getData());
}
}
//TODO explain all the outputs 1a-1f
static void explainOutputs() {
NotSimple nsObj1 = new NotSimple();
//1a
System.out.println( "nsObj1.data is\t" + nsObj1.getData() );
System.out.println( "nsObj1.str is \t" + nsObj1.getStr() );
NotSimple nsObj2 = new NotSimple( 50,
"Another immutable string!" );
//1b
System.out.println( "nsObj2.data is\t" + nsObj2.getData() );
System.out.println( "nsObj2.str is \t" + nsObj2.getStr() );
nsObj2 = nsObj1;
nsObj2.setData(10);
nsObj1.setData(100);
//1c
System.out.println( "nsObj2.data is\t" + nsObj2.getData() );
System.out.println( "nsObj2.str is \t" + nsObj2.getStr() );
nsObj1 = new NotSimple();
//1d
System.out.println( "nsObj1.data is\t" + nsObj1.getData() );
System.out.println( "nsObj1.str is \t" + nsObj1.getStr() );
System.out.println( "nsObj2.data is\t" + nsObj2.getData() );
System.out.println( "nsObj2.str is \t" + nsObj2.getStr() );
nsObj2 = new NotSimple();
//1e
System.out.println( "nsObj2.data is\t" + nsObj2.getData() );
System.out.println( "nsObj2.str is \t" + nsObj2.getStr() );
nsObj2.setData(10);
//1f
System.out.println( "nsObj1.data is\t" + nsObj1.getData() );
System.out.println( "nsObj1.str is \t" + nsObj1.getStr() );
System.out.println( "nsObj2.data is\t" + nsObj2.getData() );
System.out.println( "nsObj2.str is \t" + nsObj2.getStr() );
}
}
class NotSimple
{
NotSimple()
{
data = 5;
str = new String( "Initialized!" );
}
NotSimple( int i, String str1 )
{
data = i;
str = str1;
}
void setData( int i )
{
data = i;
return;
}
int getData()
{
return data;
}
void setStr( String str1)
{
str = str1;
return;
}
String getStr()
{
return str;
}
private int data;
private String str;
}
I want to add 1 to the array but it doesn't work. I get the following compilation error:
operator ++ cannot be applied to javaapplication1.NotSimple
Use
for (int i = 0; i < a.length; i++)
{
a[i].setData(a[i].getData()+1);
}
Since Java does not support operator overloading, you'll need to retrieve the old value (i.e. the getData() call), add 1 to it, and set it as the new value (i.e. the setData() call).
What does the NotSimple class look like?
Is NotSimple a numeric type that can be incremented so?
If NotSimple has a field called 'data' then replace a[i]++ with a[i].data++