blob: 62447b5763241a2006ea39ab56a01021b22f44c1 [file] [log] [blame]
/*
* 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.
*/
package com.adobe.ac.pmd.rules.architecture;
import org.apache.commons.lang.StringUtils;
import com.adobe.ac.pmd.nodes.IPackage;
import com.adobe.ac.pmd.parser.IParserNode;
import com.adobe.ac.pmd.rules.core.AbstractAstFlexRule;
import com.adobe.ac.pmd.rules.core.ViolationPriority;
public class UseInternalClassOutsideApiClass extends AbstractAstFlexRule
{
private static final String API_PACKAGE_NAME = "api";
private static final String INTERNAL_PACKAGE_NAME = "restricted";
private static final String PACKAGE_SEPARATOR = ".";
/*
* (non-Javadoc)
* @see
* com.adobe.ac.pmd.rules.core.AbstractAstFlexRule#findViolations(com.adobe
* .ac.pmd.nodes.IPackage)
*/
@Override
protected final void findViolations( final IPackage packageNode )
{
final String packageName = packageNode.getName();
final boolean isApiClass = isApiClass( packageName );
final boolean isInternalClass = isInternalClass( packageName );
String functionAreaName = null;
if ( isApiClass
|| isInternalClass )
{
functionAreaName = extractFunctionalArea( packageName,
false );
}
for ( final IParserNode importNode : packageNode.getImports() )
{
final String importName = importNode.getStringValue();
final String importFunctionalArea = extractFunctionalArea( importName,
true );
if ( doesLineContainPackageReference( importName,
INTERNAL_PACKAGE_NAME )
&& ( functionAreaName == null || !functionAreaName.equals( importFunctionalArea ) ) )
{
addViolation( importNode,
importName,
importFunctionalArea );
}
}
}
/*
* (non-Javadoc)
* @see com.adobe.ac.pmd.rules.core.AbstractFlexRule#getDefaultPriority()
*/
@Override
protected final ViolationPriority getDefaultPriority()
{
return ViolationPriority.HIGH;
}
private boolean doesLineContainPackageReference( final String line,
final String packageName )
{
return line.contains( PACKAGE_SEPARATOR
+ packageName );
}
private String extractFunctionalArea( final String packageName,
final boolean isInImport )
{
if ( packageName.contains( INTERNAL_PACKAGE_NAME ) )
{
return extractFunctionArea( packageName,
INTERNAL_PACKAGE_NAME,
isInImport );
}
return extractFunctionArea( packageName,
API_PACKAGE_NAME,
isInImport );
}
private String extractFunctionArea( final String packageName,
final String visibilityPackageName,
final boolean isInImport )
{
return StringUtils.substringAfterLast( StringUtils.substringBeforeLast( packageName,
PACKAGE_SEPARATOR
+ visibilityPackageName
+ ( isInImport ? PACKAGE_SEPARATOR
: "" ) ),
PACKAGE_SEPARATOR );
}
private boolean isApiClass( final String packageName )
{
return doesLineContainPackageReference( packageName,
API_PACKAGE_NAME );
}
private boolean isInternalClass( final String packageName )
{
return doesLineContainPackageReference( packageName,
INTERNAL_PACKAGE_NAME );
}
}