| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| */ |
| import java.io.PrintWriter; |
| import java.io.StringWriter; |
| import java.util.HashMap; |
| import java.util.Hashtable; |
| import java.util.Map; |
| |
| import javax.naming.CommunicationException; |
| import javax.naming.Context; |
| import javax.naming.NameAlreadyBoundException; |
| import javax.naming.NameNotFoundException; |
| import javax.naming.NamingException; |
| import javax.naming.ldap.InitialLdapContext; |
| import javax.naming.ldap.LdapContext; |
| |
| import org.apache.log4j.FileAppender; |
| import org.apache.log4j.Level; |
| import org.apache.log4j.Logger; |
| import org.apache.log4j.SimpleLayout; |
| |
| |
| //import com.telelogic.tds.common.TDSConstants; |
| //import com.telelogic.tds.common.TDSProperties; |
| //import com.telelogic.tds.engine.ldap.jndi.TDSDirObjectConstants; |
| |
| public class MultiThreadedTest extends Thread |
| { |
| |
| private Logger _logger; |
| |
| private FileAppender _appender; |
| |
| |
| public MultiThreadedTest( int i ) |
| { |
| super(); |
| this.setName( "Worker-Thread" + i ); |
| } |
| |
| |
| @Override |
| public void run() |
| { |
| |
| try |
| { |
| _logger = Logger.getLogger( this.getName() ); |
| _appender = |
| new FileAppender( new SimpleLayout(), "C:\\threadlog\\" |
| + this.getName() + ".txt", false ); |
| _logger.addAppender( _appender ); |
| _logger.setLevel( ( Level ) Level.ERROR ); |
| |
| LdapContext tdsContext = getContext(); |
| LdapContext cntx; |
| |
| // Create the initial context |
| Map<String, Object> hMap = new HashMap<String, Object>(); |
| hMap.put( "data", "dsfdfd" ); |
| |
| // authenticate user |
| for ( int i = 0; i < 100000; i++ ) |
| { |
| if ( i % 100 == 0 ) |
| { |
| System.out.println( "Thread[" + getName() + "]:" + i ); |
| } |
| try |
| { |
| |
| //System.out.println(" Ops started " + getName()); |
| |
| cntx = tdsContext.newInstance( null ); |
| |
| setUserPreferences( cntx, "adsadminPref_" + getName(), hMap, |
| i ); |
| |
| /*System.out.println(" Preferences SET " |
| + getName() |
| + " " |
| + getId() |
| + " SIZE-- " |
| + ((hMap.get("data") != null) ? hMap.get("data") |
| .toString().length() : 0));*/ |
| |
| cntx.close(); |
| |
| //System.out.println(" Ops conducted successfully " |
| // + getName()); |
| |
| } |
| catch ( NamingException e ) |
| { |
| //System.out.println(new Date() + " NAMING EXCETPION" |
| // + getName() + " " + getId()); |
| _logger.log( Level.ERROR, this.getName() + " : loop " + i ); |
| break; |
| //e.printStackTrace(); |
| } |
| catch ( Exception ex ) |
| { |
| //System.out.println(new Date() + " NAMING EXCETPION" |
| // + getName() + " " + getId()); |
| _logger.log( Level.ERROR, this.getName() + " : loop " + i ); |
| break; |
| //ex.printStackTrace(); |
| } |
| |
| //Thread.sleep(delay); |
| } |
| } |
| catch ( Throwable e ) |
| { |
| e.printStackTrace(); |
| } |
| |
| System.out.println( "Thread[" + getName() + "] ended at " + ( System.currentTimeMillis() % 1000 ) ); |
| |
| } |
| |
| |
| public static String getStackTrace( Throwable t ) |
| { |
| StringWriter sw = new StringWriter(); |
| PrintWriter pw = new PrintWriter( sw, true ); |
| t.printStackTrace( pw ); |
| pw.flush(); |
| sw.flush(); |
| return sw.toString(); |
| } |
| |
| |
| private static LdapContext getContext() |
| { |
| Hashtable<String, String> env = new Hashtable<String, String>(); |
| LdapContext context = null; |
| String adminName = "uid=admin,ou=system"; |
| String adminPassword = "secret"; |
| |
| env.put( Context.INITIAL_CONTEXT_FACTORY, |
| "com.sun.jndi.ldap.LdapCtxFactory" ); |
| env.put( Context.SECURITY_AUTHENTICATION, "simple" ); |
| env.put( Context.SECURITY_PRINCIPAL, adminName ); |
| env.put( Context.SECURITY_CREDENTIALS, adminPassword ); |
| //env.put(Context.PROVIDER_URL, "ldap://10.255.0.40:389"); |
| env.put( Context.PROVIDER_URL, "ldap://localhost:10389" ); |
| //env.put(TDSConstants.JNDI_LDAP_CONNECTION_TIMEOUT, TDSProperties |
| // .getProperty(TDSConstants.LDAP_CONNECTION_TIMEOUT, "2000")); |
| |
| env.put( "com.sun.jndi.ldap.connect.pool", "true" ); |
| |
| try |
| { |
| context = new InitialLdapContext( env, null ); |
| } |
| catch ( NamingException ne ) |
| { |
| System.exit( 1 ); |
| } |
| return context; |
| } |
| |
| |
| public void setUserPreferences( LdapContext context, String userName, |
| Map<String, Object> attributes, int count ) throws NamingException |
| { |
| |
| LdapContext derivedContext = context; |
| |
| String bindOp = "cn=" + userName + "," + "ou=system"; |
| |
| try |
| { |
| |
| try |
| { |
| // Step 1: Unbind the user preferences data |
| //System.out.println("Unbind[" + count + "]" + bindOp); |
| _logger.info( "Unbind[" + count + "]" + bindOp ); |
| derivedContext.unbind( bindOp ); |
| } |
| catch ( CommunicationException ce ) |
| { |
| System.out.println( "Trying to re-connect to RDS" ); |
| _logger.info( "Trying to re-connect to RDS" ); |
| //Impl reconnect logic |
| |
| } |
| catch ( NameNotFoundException nnf ) |
| { |
| System.out.println( "User: " + userName |
| + " cannot be found in the Ldap server" ); |
| _logger.info( "User: " + userName |
| + " cannot be found in the Ldap server" ); |
| } |
| |
| try |
| { |
| // Step 2: Bind the user preferences data |
| //System.out.println("Bind[" + count + "]" + bindOp); |
| derivedContext.bind( bindOp, attributes ); |
| } |
| catch ( CommunicationException ce ) |
| { |
| System.out.println( "Trying to re-connect to RDS" ); |
| } |
| catch ( NameAlreadyBoundException nab ) |
| { |
| System.out.println( "User: " + userName |
| + " already exists in the Ldap server" ); |
| } |
| |
| //derivedContext.rebind(bindOp, attributes); |
| } |
| catch ( NamingException ne ) |
| { |
| //System.out.println("Could not set user profile for user: " |
| // + userName); |
| //ne.printStackTrace(); |
| _logger.log( Level.ERROR, count ); |
| throw ne; |
| } |
| } |
| |
| |
| /** |
| * @param args |
| */ |
| public static void main( String[] args ) |
| { |
| Thread t1 = null; |
| |
| System.out.println( System.currentTimeMillis() % 1000 ); |
| for ( int i = 0; i < 20; ++i ) |
| { |
| t1 = new MultiThreadedTest( i ); |
| t1.start(); |
| } |
| } |
| |
| } |