The following document contains the results of RAT (Release Audit Tool).
***************************************************** Summary ------- Notes: 0 Binaries: 10 Archives: 0 Standards: 25 Apache Licensed: 13 Generated Documents: 0 JavaDocs are generated and so license header is optional Generated files do not required license headers 12 Unknown Licenses ******************************* Unapproved licenses: examples/file_store.csv pom.xml src/main/java/com/ning/metrics/goodwill/binder/listeners/GoodwillGuiceListener.java src/main/java/com/ning/metrics/goodwill/binder/modules/GoodwillSinkProvider.java src/main/java/com/ning/metrics/goodwill/binder/modules/GoodwillStoreProvider.java src/main/java/com/ning/metrics/goodwill/dao/DAOAccess.java src/main/java/com/ning/metrics/goodwill/dao/DAOBoneCPAccess.java src/main/java/com/ning/metrics/goodwill/dao/DAOUtil.java src/main/java/com/ning/metrics/goodwill/endpoint/Sink.java src/main/java/com/ning/metrics/goodwill/modules/ThriftRegistrar.java src/main/java/com/ning/metrics/goodwill/sink/GoodwillSink.java src/main/java/com/ning/metrics/goodwill/sink/NetezzaSink.java ******************************* Archives: ***************************************************** Files with Apache License headers will be marked AL Binary files (which do not require AL headers) will be marked B Compressed archives will be marked A Notices, licenses etc will be marked N !????? examples/file_store.csv AL LICENSE-2.0.txt !????? pom.xml AL src/main/java/com/ning/metrics/goodwill/binder/config/GoodwillConfig.java !????? src/main/java/com/ning/metrics/goodwill/binder/listeners/GoodwillGuiceListener.java AL src/main/java/com/ning/metrics/goodwill/binder/modules/GoodwillServicesModule.java !????? src/main/java/com/ning/metrics/goodwill/binder/modules/GoodwillSinkProvider.java !????? src/main/java/com/ning/metrics/goodwill/binder/modules/GoodwillStoreProvider.java !????? src/main/java/com/ning/metrics/goodwill/dao/DAOAccess.java !????? src/main/java/com/ning/metrics/goodwill/dao/DAOBoneCPAccess.java !????? src/main/java/com/ning/metrics/goodwill/dao/DAOUtil.java AL src/main/java/com/ning/metrics/goodwill/endpoint/Registrar.java !????? src/main/java/com/ning/metrics/goodwill/endpoint/Sink.java !????? src/main/java/com/ning/metrics/goodwill/modules/ThriftRegistrar.java !????? src/main/java/com/ning/metrics/goodwill/sink/GoodwillSink.java !????? src/main/java/com/ning/metrics/goodwill/sink/NetezzaSink.java AL src/main/java/com/ning/metrics/goodwill/store/CSVFileStore.java AL src/main/java/com/ning/metrics/goodwill/store/GoodwillStore.java AL src/main/java/com/ning/metrics/goodwill/store/MySQLStore.java AL src/main/resources/log4j.xml AL src/main/webapp/css/global.css B src/main/webapp/images/add-hover.png B src/main/webapp/images/add.png B src/main/webapp/images/blue.png B src/main/webapp/images/blue2-hover.png B src/main/webapp/images/blue2-hover.pxm B src/main/webapp/images/blue2.png B src/main/webapp/images/link-hover.png B src/main/webapp/images/link.png B src/main/webapp/images/Remove2-hover.png B src/main/webapp/images/Remove2.png AL src/main/webapp/registrar/index.html AL src/main/webapp/registrar/type.jsp AL src/main/webapp/WEB-INF/web.xml AL src/test/java/com/ning/metrics/goodwill/store/MySQLStoreTest.java ***************************************************** Printing headers for files without AL header... ======================================================================= ==examples/file_store.csv ======================================================================= "EVENTTYPE","FIELDID","FIELDTYPE","FIELDNAME","MINVERSION","MAXVERSION" "Awesomeness",1,"date","date",1,2147483647 "Awesomeness",2,"string","cat",1,2147483647 "Awesomeness",3,"double","puppy_quotient",1,2147483647 "Awesomeness",4,"i16","stars",1,2147483647 ======================================================================= ==pom.xml ======================================================================= <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>com.ning</groupId> <artifactId>metrics.base-pom</artifactId> <version>0.0.3</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.ning</groupId> <artifactId>metrics.goodwill</artifactId> <packaging>war</packaging> <version>1.2.3-SNAPSHOT</version> <name>goodwill</name> <description>Store for sharing schemata (Thrift, Smile, ...) between HDFS, DataWarehouses, and other</description> <url>http://github.com/pierre/goodwill</url> <scm> <connection>scm:git:git://github.com/pierre/goodwill.git</connection> <developerConnection>scm:git:git@github.com:pierre/goodwill.git</developerConnection> <url>http://github.com/pierre/goodwill/tree/master</url> </scm> <dependencies> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </dependency> <dependency> <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> </dependency> <dependency> <groupId>com.google.inject.extensions</groupId> <artifactId>guice-multibindings</artifactId> </dependency> <dependency> <groupId>com.google.inject.extensions</groupId> <artifactId>guice-servlet</artifactId> </dependency> <dependency> <groupId>com.jolbox</groupId> <artifactId>bonecp</artifactId> </dependency> <dependency> <groupId>com.ning</groupId> <artifactId>metrics.goodwill-access</artifactId> </dependency> ======================================================================= ==src/main/java/com/ning/metrics/goodwill/binder/listeners/GoodwillGuiceListener.java ======================================================================= package com.ning.metrics.goodwill.binder.listeners; import com.ning.jetty.base.modules.ServerModuleBuilder; import com.ning.jetty.core.listeners.SetupServer; import com.ning.jetty.utils.healthchecks.DBIHealthCheck; import com.ning.jetty.utils.log4j.Log4JMBean; import com.ning.metrics.goodwill.binder.config.GoodwillConfig; import com.ning.metrics.goodwill.binder.modules.GoodwillServicesModule; import javax.servlet.ServletContextEvent; public class GoodwillGuiceListener extends SetupServer { @Override public void contextInitialized(ServletContextEvent event) { final ServerModuleBuilder builder = new ServerModuleBuilder() .addConfig(GoodwillConfig.class) .addJMXExport(Log4JMBean.class) .setAreciboProfile(System.getProperty("action.arecibo.profile", "ning.jmx:name=MonitoringProfile")) .addModule(new GoodwillServicesModule()) .addResource("com.ning.metrics.goodwill.endpoint"); guiceModule = builder.build(); super.contextInitialized(event); } } ======================================================================= ==src/main/java/com/ning/metrics/goodwill/binder/modules/GoodwillSinkProvider.java ======================================================================= package com.ning.metrics.goodwill.binder.modules; import com.google.inject.Inject; import com.google.inject.Provider; import com.ning.metrics.goodwill.binder.config.GoodwillConfig; import com.ning.metrics.goodwill.sink.GoodwillSink; import com.ning.metrics.goodwill.sink.NetezzaSink; import org.apache.log4j.Logger; public class GoodwillSinkProvider implements Provider<GoodwillSink> { private static final Logger log = Logger.getLogger(GoodwillSinkProvider.class); private final GoodwillConfig config; @Inject public GoodwillSinkProvider(final GoodwillConfig config) { this.config = config; } @Override public GoodwillSink get() { final String sinkType = config.getSinkType(); if (sinkType == null) { return null; } else if (sinkType.equals("netezza")) { log.info("Enabled Netezza sink"); return new NetezzaSink(config); } else { throw new IllegalStateException("Unknown sink type " + sinkType); } } } ======================================================================= ==src/main/java/com/ning/metrics/goodwill/binder/modules/GoodwillStoreProvider.java ======================================================================= package com.ning.metrics.goodwill.binder.modules; import com.google.inject.Inject; import com.google.inject.Provider; import com.ning.metrics.goodwill.binder.config.GoodwillConfig; import com.ning.metrics.goodwill.dao.DAOBoneCPAccess; import com.ning.metrics.goodwill.store.CSVFileStore; import com.ning.metrics.goodwill.store.GoodwillStore; import com.ning.metrics.goodwill.store.MySQLStore; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; public class GoodwillStoreProvider implements Provider<GoodwillStore> { private static final Logger log = LoggerFactory.getLogger(GoodwillServicesModule.class); private final GoodwillConfig config; @Inject public GoodwillStoreProvider(final GoodwillConfig config) { this.config = config; } @Override public GoodwillStore get() { final String storeType = config.getStoreType(); if (storeType.equals("mysql")) { log.info("Enabling MySQL store"); try { return new MySQLStore(config, new DAOBoneCPAccess(config)); } catch (IOException e) { log.error("Unable to connect to MySQL", e); } } else if (storeType.equals("csv")) { log.info("Enabling CSV store"); try { return new CSVFileStore(config); } catch (IOException e) { log.error("Unable to create the CSV file store", e); } } else { throw new IllegalStateException("Unknown store type " + storeType); ======================================================================= ==src/main/java/com/ning/metrics/goodwill/dao/DAOAccess.java ======================================================================= package com.ning.metrics.goodwill.dao; import javax.sql.DataSource; public interface DAOAccess { public DataSource getDataSource(); } ======================================================================= ==src/main/java/com/ning/metrics/goodwill/dao/DAOBoneCPAccess.java ======================================================================= package com.ning.metrics.goodwill.dao; import com.google.inject.Inject; import com.google.inject.Singleton; import com.jolbox.bonecp.BoneCPConfig; import com.jolbox.bonecp.BoneCPDataSource; import com.ning.metrics.goodwill.binder.config.GoodwillConfig; import javax.sql.DataSource; @Singleton public class DAOBoneCPAccess implements DAOAccess { private final DataSource dataSource; @Inject public DAOBoneCPAccess( GoodwillConfig config ) { this(config.getStoreDBHost(), config.getStoreDBPort(), config.getStoreDBName(), config.getStoreDBUsername(), config.getStoreDBPassword()); } public DAOBoneCPAccess(String DBHost, int DBPort, String DBName, String DBUsername, String DBPassword) { BoneCPConfig boneCPConfig = new BoneCPConfig(); boneCPConfig.setJdbcUrl(String.format("jdbc:mysql://%s:%d/%s", DBHost, DBPort, DBName)); boneCPConfig.setUsername(DBUsername); boneCPConfig.setPassword(DBPassword); boneCPConfig.setMinConnectionsPerPartition(1); boneCPConfig.setMaxConnectionsPerPartition(10); boneCPConfig.setPartitionCount(1); dataSource = new BoneCPDataSource(boneCPConfig); } @Override public DataSource getDataSource() { return dataSource; } } ======================================================================= ==src/main/java/com/ning/metrics/goodwill/dao/DAOUtil.java ======================================================================= package com.ning.metrics.goodwill.dao; import com.ning.metrics.goodwill.store.MySQLStore; import org.apache.log4j.Logger; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public final class DAOUtil { private static Logger log = Logger.getLogger(MySQLStore.class); /** * Quietly close the Connection * * @param connection The Connection to be closed quietly */ public static void close(Connection connection) { if (connection != null) { try { connection.close(); } catch (SQLException e) { log.warn("Closing Connection failed: " + e.getLocalizedMessage(), e); } } } /** * Quietly close the Statement * * @param statement The Statement to be closed quietly */ public static void close(Statement statement) { if (statement != null) { try { statement.close(); } catch (SQLException e) { log.warn("Closing Statement failed: " + e.getLocalizedMessage(), e); } } } /** ======================================================================= ==src/main/java/com/ning/metrics/goodwill/endpoint/Sink.java ======================================================================= package com.ning.metrics.goodwill.endpoint; import com.google.inject.Inject; import com.ning.metrics.goodwill.access.GoodwillSchema; import com.ning.metrics.goodwill.sink.GoodwillSink; import com.ning.metrics.goodwill.store.GoodwillStore; import org.apache.log4j.Logger; import javax.annotation.Nullable; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; @Path("sink") public class Sink { private Logger log = Logger.getLogger(Sink.class); private GoodwillStore store; private final GoodwillSink sink; @Inject public Sink( GoodwillStore store, @Nullable GoodwillSink sink ) { this.store = store; this.sink = sink; } @POST @Path("/{type}/") @Produces(MediaType.TEXT_PLAIN) public Response addTypeToSink(@PathParam("type") String typeName) throws Exception { GoodwillSchema typeFound = store.findByName(typeName); log.debug(String.format("Found type: %s", typeFound)); if (typeFound != null) { if (sink.addType(typeFound)) { return Response.status(Response.Status.CREATED).build(); } else { return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); } } ======================================================================= ==src/main/java/com/ning/metrics/goodwill/modules/ThriftRegistrar.java ======================================================================= package com.ning.metrics.goodwill.modules; import java.io.ByteArrayOutputStream; public class ThriftRegistrar { private final ByteArrayOutputStream storeInJSON; private String actionCoreURL; public ThriftRegistrar(ByteArrayOutputStream storeInJSON) { this.storeInJSON = storeInJSON; } public ByteArrayOutputStream getStoreInJSON() { return storeInJSON; } /** * Setter for the actionCoreURL field. * The action core is an open-source HDFS front-end, similar to the one provided by the Namenode, * but on steroids. * * @param actionCoreURL URL to the action core instance * @link http://github.com/pierre/action-core */ public void setActionCoreURL(String actionCoreURL) { this.actionCoreURL = actionCoreURL; } public String getActionCoreURL() { return actionCoreURL; } } ======================================================================= ==src/main/java/com/ning/metrics/goodwill/sink/GoodwillSink.java ======================================================================= package com.ning.metrics.goodwill.sink; import com.ning.metrics.goodwill.access.GoodwillSchema; public interface GoodwillSink { /** * Add a new type to the sink * * @param schema GoodwillSchema to add * @return true on success, false otherwise * @throws Exception if an exception occurs talking to the sink */ public boolean addType(GoodwillSchema schema) throws Exception; /** * Update a type to the sink * * @param schema GoodwillSchema to update * @return true is success, false otherwise */ public boolean updateType(GoodwillSchema schema); /** * Give human readable information on how to add a Type in the sink * This is used in the UI * * @param schema GoodwillSchema to add * @return info how to create a Type in the sink */ public String addTypeInfo(GoodwillSchema schema); } ======================================================================= ==src/main/java/com/ning/metrics/goodwill/sink/NetezzaSink.java ======================================================================= package com.ning.metrics.goodwill.sink; import com.google.inject.Inject; import com.ning.metrics.goodwill.access.GoodwillSchema; import com.ning.metrics.goodwill.access.GoodwillSchemaField; import com.ning.metrics.goodwill.binder.config.GoodwillConfig; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.netezza.datasource.NzDatasource; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; public class NetezzaSink implements GoodwillSink { private final Logger log = Logger.getLogger(NetezzaSink.class); private final GoodwillConfig config; @Inject public NetezzaSink( GoodwillConfig config ) { this.config = config; } /** * Add a new type to the sink * <p/> * For Netezza, this means creating a table where the data can be dumped. The CREATE TABLE statement * is constructed from the SQL information documented in the ThriftFields. * * @param schema GoodwillSchema to add */ @Override public boolean addType(GoodwillSchema schema) throws SQLException, IOException, ClassNotFoundException { boolean success = false; try { Connection connection = connectToNetezza(config.getSinkDBFirstHost(), config.getSinkDBFirstPort(), config.getSinkDBFirstSchema(), config.getSinkDBFirstUsername(), config.getSinkDBFirstPassword()); String createTableStatement = getCreateTableStatement(schema); Statement statement = connection.createStatement(); statement.addBatch(createTableStatement);